Another thing could be exchange of QueryRoutingTable. Phex checks for hits against a bit field that was received from connected hosts. When the QRT is not up to date or wasnt send yet, it might not forward the Query to the host.
One more thing is dynamic query. Dynamic querying will not broadcast the query to all hosts in the network right away. It will forward the query to a selected number of hosts with a low TTL and waits for results. If not enough results are returned dynamic query will slowly extend the TTL and forwards the query to more hosts. If you already receive many results ~150-200 on the first hop. Phex might not ask for more results or only continue to query with low TTL, so you might not reach hosts not directly connected to you.
Read this to understand the details:
Gnutella Developer Forum: Gnutella Dynamic Query Protocol v0.1