*kopfklatsch* Klar, alle 20ms sind 50Hz. Ok.

Bei jedem Refresh wird eine Routine angestoßen, die den Inhalt der Servotabelle einfach auf die Ports schmeißt. In der Tabelle sind die Übergangszeiten (sprich von der aktuellen Zeile zur nächsten), sowie die Pin Signale kodiert. Wie du selber sagst, ist die kürzeste Zeit 0,75ms, die Längste 2,25ms. Das ist eine Differenz von 1,5ms. Bei den von dir vorgegebenen Zeitintervallen wäre die maximale Abarbeitungszeit der Tabelle 1,5ms. (Eintrag eins ausgeben, 1,5ms warten, Eintrag zwei Ausgeben, return).

Das ganze andere Zeug (wie schnell bewegen, von wo bis wo) übernehmen dann andere Routinen. Das könnte man jetzt wieder mit einer Tabelle oder Liste lösen (Servoposition zur Zeit t).
Jetzt kann man entweder die ganze Servotabelle vorberechnen, oder man macht es Schrittweise (Animationstabelle mit n Schritten und Servotabelle jeweils neu berechnen).

Ich fahre meine Servos mit 100Hz, die Positionsvorgaben für Animationen kommen von extern über UART, läuft alles super. 330Hz sollten auch drin sein.