Does each prefork child handles one connection or handles one request
per time?
Each child / thread handles one connection (TCP connection).
Once the connection is closed, the child process will wait for another connection. On one connection one can send 0, 1 or more requests (HTTP request).
If the client doesn’t send a request, you may have a HTTP 408 time out in your logs depending on your configuration.
With KeepAlive enabled you can have more than 1 HTTP request per connection, as the connection will not be closed once the first request is served.
In the case without KeepAlive, there is 1 connection with one request, that’s why may be the question.
each new connection needs to wait in the queue to be handled by one of
the idle child processes?
Yes, that is why you will configure Apache to have some idle servers / threads, so new connections do not need to wait for new child processes / threads to be created. If there aren't enough child process, new will be created as needed and according to the limits in the configuration.
So far for my own understanding of the process.