Note that you do not "control" timing as such - that suggests you are somehow "in control" of the time as if using delay().
What you do is to use millis() to see whether on any pass through each function, there is something to be done; whether it is yet the time for that thing to be done. If so, do it - instantly - and move on. If it is not yet time, move on immediately. In either case, you do not wait in any manner. If what you did in that pass through the function then implies the need to wait for another action, you set the "state" so that future passes check on the new criterion whether that is a particular time or some other event.