Hi @Jack
I think you are trying to enforce a philosophical point and not a technical one here. This is classic cooperative multi-taskting where any subroutine that blocks will disturb the cooperation and penalize the other subroutines. That doesn’t mean however that your spec is required to be “no delays in subroutines” and on the contrary a perfectly valid spec might be delays up to 10ms are allowed in any particular subroutine.
The delay can be whatever is acceptable in your application, ranging from the code minimum execution time up to any maximum you choose. If you are philosophically attracted to minimum delay, that’s great, but it is not the only valid approach. Different programmers are going to address this in different ways.
Whether the cooperative subroutines are called by loop() as a scheduler or by a timer interrupt is really just a preference. @peekay123 hybrid scheme of using timer interrupts to call the 1 millisecond task that then dispatches based on a count is just small refinement (and clever!).
There are a lot possible “right” answers here and I am glad you found yours, but that does not rule out other options for other applications.