Als mit vernichten von Prozessorzeit hat das nix zu tun. In einer ISR ist das eher ungünstig, und was die Codegröße angeht ist es auch schlechter als mit nur einem if.
Hat wohl didaktische Gründe. Erst mal auf eine ms und dann auf eine Sekunde. So kann man auch 1000s lang warten, ohne gruß was zu ändern. Mit nur 1 Variablen würd die überlaufen. Ich vermute mal, der Compiler arbeitet mit 16-bit-ints. Möglich wären auch 32 bit, ist aber eher unwahrscheinlich. Wie groß ein int werden kann siehst du in der Doku oder mit sizeof(int), das die die Anzahl der bytes gibt, die der Typ belegt.
Bit 16 bit ist
0x8000 = -32768 <= int <= 32767 = 0x7fff
, damit kann man nicht so weit zählen, und mit char schon gar nicht
0x80 = -128 <= char <= 127 = 0x7f

Als Zählvariablen nummt man übrigens besser unsigned, wegen

0 <= unsigned int <= 65535 = 0xffff
0 <= unsigned char <= 255 = 0xff

Wenn man mit einem Zähler eine Zeit von 10s warten wollte, würde man auf 40000 vergleichen. Ein guter Compiler meckert so was an, mit 'comparison always false/true due to limited range of data type' oder so. Mit unsigned short würd es noch passen.