У тебя вообще может быть например отдельный I/O thread в который твоя библиотека aio которую дергает твоя программа сгружает весь I/O, и который внутри себя где-то делает синхронно, где-то через io_submit, где-то еще как-нибудь, но твой основной тред при этом не ждет. Собственно, libaio и получается