I can't see any other way of creating a system that doesn't choke in the presence of a few bad or unavailable modules. If you just come to a stop and wait for some worst case reply time every time you come to a module that's not being happy, then latency goes way up. Even if you aren't purposefully doing overlapped I/O, if you give up quickly on a module that doesn't respond in a short time and move on to the next one, you are effectively doing overlapped I/O if the first module then responds after the fact, except that you probably just ignore the reply because it doesn't come while you are waiting for it.
From a practical standpiont, I'm not sure I see how it's much different than having multiple controllers on the the network. If controller A asks module B for a value and at about the same time controller C asks module D for a value, then there is effectivley overlapped requests on the network. This happens if you use a hand held remote while the USB controller is constantly active on the network, or your have two people press a transmitter switch at about the same time, while the controller is constantly active on the network.
Keep in mind that I'm not talking about multiple threads all banging away at the same controller at the same time. I'm talking about a single thread that's keeping a few outstanding polls at any time one time. It just sends the request, but doesn't wait synchronously for a reply. It'll get that reply later when/if it comes in. Once it gets a reply for one, it can then queue another one.
The other option, of just doing single threaded, one unit at a time polling, unless you are going to give up pretty quickly if no response is forthcoming, doesn't seem like a viable strategy. And if you do give up, then you are still kind of doing the same thing I'm doing now purposefully.