Bei dem Code hat der µC schon einiges zu tun. Es ist ja nicht so das aus einem C Befehl genau ein ASM Befehl wird. Den erzeugten Code kann man sich auch gleich ansehen. GCC erzeugt auch einen so einigermaßen lesbaren ASM Code.

Im Idealfall müsste der Code für die Schleife etwa so aussehen:
Start:
In R16, PORTD
EOR R16, 8
OUT PORT16, R16
RJMP start

Der handoptimierte ASM code braucht 5 Zyklen für einen Druchlauf und würde damit eine Frequenz von 100 kHz erzeugen. Das ist der Compiler mit 66 kHz (also 7 oder 8 zyklen für die Schleife) schon nicht so schlecht, könnte aber natürlich besser werden.

Bei -O3 könnte man theoretisch ein loop unrolling erwarten - wird hier aber offensichtlich nicht gemacht.