Zur ersten Variante:
Du verwendest Timer0 im CTC, das Output Compare Modul bestimmt die Frequenz indem es beim Match den Timer zurücksetzt. Im allgemeinen(!) erreicht der Timer 255=MAX nie, das TOV-Flag wird nicht gesetzt.
Folglich nutzt Du als Interrupt den des Output Compare Modules.
Was geschieht?
Einen Timertakt nach dem Match wird das "Timer/Counter0, Output Compare A Match Flag" gesetzt und der Timer selbst auf null. Da sowohl das "Timer/Counter0, Output Compare A Match Interrupt Enable"-Bit als auch das I in SREG gesetzt sind, wird nach Abarbeitung des laufenden Befehles der Program-Counter auf den Stack gepusht und 0x0020 in den ProgramCounter geladen. Bis hier vergehen mindestens vier Takte.
In Adresse 0x0020 steht ein absoluter Sprung zur COMP-A-ISR. Dieser kostet weitere drei Takte. Das Return am Ende der ISR stellt Stack und Program-Counter wieder her, und kostet nochmal vier Takte.
Also mindestens elf Takte zuzüglich zum Inhalt der ISR.
Bei Variante eins könntest Du auf den Interrupt verzichten, und statt Deines flag_1ms direkt das OCFA-Flag pollen. TIFR0 ist direct bit accessible, es wird also kein Rechenregister für den Zugriff benötigt SBIS/SBIC zum prüfen sowie SBI zum löschen des Flags greifen. Inwiefern Du das ganze bei Klammercodinesisch nutzen kannst, mußt Du wissen.