VMS had asynchronous programming to its core. Most system calls could be performed synchronously or async. You just had to give the async call a flag that would indicate when the response was ready. So you could read a file or connect to the network, continue execution and when you actually needed the answer, just sys$wait(flag). Or have callback functions.
It worked extremely well as some else mentioned, 64Mb of RAM was enough to handle 200 interactive users with RDB (database IMO far superior to Oracle that was acquired by them and promptly buried)