В for сначала проверяется условие, а потом выполняется декремент при успешности, а в while всегда.

Код:
var i:int=4;
var j:int=4;
for (i; i>0; i--) {
for (j; j>0; j--) {
trace (i,j);
}
trace (i,j)
}

Код:
var i:int=4;
var j:int=4;
while (i--) {
while (j--) {
trace (i,j);
if (i==0 || j < -20) {
trace ("--")
break;
}
}
if (i==0 || j < -20) {
trace ("-")
break;
}
}
trace (i,j);
Поэтому после первого выполнения условия j == 0 (при i == 3), потом был еще один декремент и j стало равным -1 и соотвественно при i == 2, второй раз условии стало недостижимым.