Der Code in der ISR ist so lang, das er µC auch etwa die 256 Zyken für den code braucht. Wenn man den Timer schneller stellt, werden einfach ein paar Interrupts verschluckt und die Geschwindigkeit wird duch den Code bestimmt.

Man kann den Code noch etwas beschleunigen:
Der Zugriff auf das 2 D Array ist ungünstig. Da lieber getrennt array nehmen. Der 2 te Punkt ist das Setzen der Bits. Es sollte schneller gehen, erst den wert für den kompletten port zusammentzstellen und dann in eins auszugeben.

Wenn das alles nichts hilft, bliebe noch inline ASM. Beim Soft-PWM ist der Geschwindigkeitsvorteil ziehmlich groß, weil man da das varry flag effektiv nutzen kann. Trotzdem wird man da nicht auf 20 Zyklen für die ISR kommen. Die Grenze sollte bei etwa 40-50 Zyklen liegen für 6 Kanäle mit 16 Bit PWM.