An edge-triggered reactor like epoll with EPOLLET flag enabled supposes that at every iteration user (I/O handler) has to drain/fill all buffers to be able to receive next event on the same socket. If you're notified that a socket is writable, you keep writing to it until you get EAGAIN, same for reading.
curl_multi_socket_action() performs single iteration around given socket. To fit in the above mentioned model either one modification is needed:
The later approach seems better to me, but most likely will require many changes in multi implementation and, even worse, in some protocol implementation like SSL.