Sin embargo, la explicación concreta es que en cada ciclo $row toma el valor devuelto por mysql_fetch_array().
Así, mientras haya resultados por recorrer $row es un array con las filas de tu resultado una a una. Al terminar de recorrer los resultados mysql_fetch_array() devuelve false, por lo que $row toma el valor de false. Y si analizamos un poco la sintaxis,
($row = false) ==
false. Osea, el resultado de la
asignación a una variable del valor booleano false devuelve en su conjunto false. Por eso es que el ciclo termina, y el valor final de $row es el booleano false.