This is easier if you use classes. For example, in a program I'm writing now, I've got to poll sensors and an RTC and then make decisions based upon that -- several of these decision objects (called outletObjects in my code) are timers and other things that work asynchronously. You instantiate the classes as global variables and then link them all to the data object by passing them its address during setup. In each execution of the main loop, you poll the sensors, record the data to the globalDataObject, and then tell each OutletObject to look at that data and do their thing, one by one.
Basically, it looks something like this:
poller.pollsensors(); // Looks at all the sensors and records the data to globalDataObject;
OutletObjectA.tick(); // Tells OutletObject A to do its thing -- it looks at the globalDataObject and, depending on the type of outletObject, does stuff based on that data
If you encapsulate each function as its own object like this, you get a kind of ghetto multithreading. If you take care to avoid using things like delay() and extensive looping inside the decision objects, it works pretty well.