Code:
  Flag=1; 
  while(Flag)  { 
    start_some_timer(); //generates overflow interrupt after some time 
    Flag=0; 
  }
Ist ja logisch, die Schleife wird solange ausgeführt, wie flag nicht 0 ist.
Da flag aber beim ersten durchlauf auf 0 gesetzt wird, wird die
Schleife nur einmal durchlaufen. Der Compiler erkennt das
und optimiert das so, dass im Assembler kein Sprungbefehl mehr
vorkommt.

Die For-Schleife läuft immer durch und start...() wird aufgerufen wenn
flag gesetzt ist, danach wird flag gelöscht.
Wenn du genau das Erreichen willst ersetz einfach for(;; ) durch
while(1).