One problem is that the values you are retrieving with the for loop are integers that are being used as indexes to update the values of the array. A second problem is that your conditional statement is actually an assignment, so its exit code is always 0 (true), so $count, though incrementing, affects nothing.
First time through, $i==2, the third element of array is incremented (array[2]==2), the third element of the tag array is set to changed
The second time through, $i==0, the first element of array is incremented (array[0]==3), the first element of tag array is set to changed.
The third time through, $i==1 (see comment below), the second element of array is incremented (array[1]==1), and the second element of the tag array is set to changed.
Promised comment: In the third iteration, other languages would have $i==2 because array[2] had been incremented in the first loop. Bash is apparently iterating over the original values of the array, despite subsequent changes.
I think what you want to do is:
declare -a array=(2 0 1)
declare -a tag=("here" "here" "here")
declare -i count=0
declare -i i
echo "$count: ${array[*]}"
echo " ${tag[*]}"
for (( i=0; i<${#array[*]}; ++i )); do
(( array[i]++ )) # no need for '$' within (( ))
tag[$i]="changed"
(( count++ ))
echo "$count: ${array[*]}"
echo " ${tag[*]}"
done
I didn't include your conditional because I can't figure out what you're trying to do with it.
I added the echo statements to create output similar to the output you claimed in your example.
"${array[@]}"will give you a list of the array values while"${!array[@]}"will give you a list of the array indices