As you've been told in comments, expansion happens at the time of assignment. The variable $yes contains a string which includes the value of $number at the time of assignment. After assignment, there is nothing in the content of $yes which would indicate any connection to the variable $number.
There are two common ways to get this kind of functionality.
First, you can use eval.
#!/usr/bin/env bash
number=1
yes='number$number/' # note the single quotes
for i in 1 2 3; do
echo "$number"
eval "echo \"$yes\""
((number++))
done
Note that the value of $yes is NOT being updated here -- it's simply being used to expand what is printed by echo.
You will find that many people discourage the use of eval, as it can have unintended security related consequences.
Second, you could just update yes each time you run through the loop.
#!/usr/bin/env bash
number=1
for i in 1 2 3; do
echo "$number"
yes="number$number/"
echo "$yes"
((number++))
done
If you're looking to use this for formatting, then printf is your friend:
#!/usr/bin/env bash
number=1
yesfmt='number%d\n'
for i in 1 2 3; do
echo "$number"
printf "$yesfmt" "$number"
((number++))
done
Without knowing the bigger picture or what you're trying to achieve, it's difficult to recommend a strategy.
yes="number$number/"is assigned once. It does not update when the value of$numberchanges.$numberinstead.