Die Timer-Events werden über Windows-Messages generiert und reihen sich mit niedriger Priorität ein in alle anderen Messages vom Betriebsystem.
Wenn Dein Programm zu beschäftigt ist, um sie abzuarbeiten, stauen die sich in der Event-Queue. Dann können einzelne Timer auch mal ausfallen oder eben in Deinem Fall in kürzerer Zeit hintereinander abgearbeitet werden.
Eigentlich werden WM_TIMER Messages erst auf Anfrage erzeugt, aber es gibt Fälle, wo diese dann ignoriert werden und sich in der Message-Queue stauen.
Raymond Chen hat da mal ausführlich was zu geschrieben:
Why is my message queue full of WM_TIMER messages?