Graças a Baptiste Assmann eu consegui a resposta para o ponto 2 eu perguntei - Uma vez que o servidor PHP responde a HAProxy, então a resposta segue o caminho inverso, então a resposta passa pelo Varnish (então é armazenado em cache) e então retorna para HAProxy então o cliente.
Para o ponto 1, a condição de loop que mencionei (graças a Baptiste novamente) pode ser corrigida colocando uma ACL na configuração HAP que roteia o tráfego para servidores PHP (estou usando o IP do Varnish como condição), portanto, quando falta o cache acontece o HAP obtém o pedido do verniz, obtém os recursos e segue o caminho inverso e vai para o Varnish, depois para o HAP e, finalmente, para o usuário. Eu testei essa condição e os registros do HAP informam claramente que está funcionando:
108.108.108.108:21478 [08/Jan/2013:11:58:16.**637**] inbound varnish/varnish0 1/0/0/1803/2182 200 45872 – - —- 2/2/0/1/0 0/0 {abc.xxx.com} “GET / HTTP/1.1″
192.168.1.1:37029 [08/Jan/2013:11:58:16.**639**] inbound worker/worker0 0/0/0/1796/1802 200 45776 – - –NI 2/2/0/1/0 0/0 {abc.xxx..com} “GET / HTTP/1.1″
A chamada chega ao HAP e, como o cookie não está disponível, o HAP envia para o verniz, ocorre a falta do cache e o worker0 é usado para obter recursos pelo HAP. Na próxima chamada (estou cacheando por 1m) o Varnish serve tudo do cache (o varnishlog me disse isso) e os servidores PHP não são contatados.
Obrigado