Вы можете посмотреть это в стандарте. Цикл for с разрывом по определению похож на while, goto, вот так:
for( init; test; incr){
break;
}
есть
init
while(test){
// do things
goto end
incr
}
end:
Таким образом, поскольку разрыв всегда выполняется, он никогда не будет увеличивать часть приращения, и ни foo, ни i не будут увеличиваться.