The first time linkerd receives a request for a service, it gets the list of replicas from Zookeeper and store it in memory. It also establishes a Zookeeper watch on that service so that it gets updates immediately as they happen. Therefore, linkerd does not need to query Zookeeper for every inbound call.
In this case, namerd establishes watches on zookeeper and linkerd establishes watches on namerd. So again, no need for a namerd or zookeeper query on each call.
It depends on the which namerd interface you’re using. If you’re using the io.l5d.thriftNameInterpreter then the watch is implemented as a long-poll. Linkerd will issue a request to namerd that will only be satisfied when there is an update. If updates are happening roughly every 5 seconds, then you would see the behavior you described.
The io.l5d.mesh, and io.l5d.httpController interfaces use streaming to push updates to linkerd.