There is no watcher: threads get parked by the kernel as "not runnable" while they perform the I/O operation.
When the operation is finished, then they become runnable again so the kernel scheduler runs them--that is, it runs the code that comes after the I/O operation.
This code (from libuv) notifies the requester that the operation is complete.