The fundamental problem is that readiness based async IO and random access to not mix well. You'd need a way to poll readiness for different positions in the same file at the same time.
Completion based async (including io_uring on Linux or IO completion ports on Windows) doesn't suffer from this problem.
Completion based async (including io_uring on Linux or IO completion ports on Windows) doesn't suffer from this problem.