(SOLVED) synchronicity strangeness

Close.
What is happening is that you don't get the action until the millisecond after the time so
1000 times out in 1001 mS
2000 times out in 2001 mS
3000 times out in 3001 mS
As they are no longer multiples of each other they will not be in sync.

If you want to prove this then use the original program and set the times to:-
999
1999
2999
If they stay in sync that's it.

Note you need to see the millis() clock every milli second. If not then calculate the next time not from the current value of millis() but from the last threshold. That is add the time period to the threshold you previously calculated not the current clock. This keeps things in sync.