grep está armazenando em buffer (porque determina que sua saída não é terminal; a rigor, esse é o comportamento da biblioteca C).
Para desabilitar isso, execute-o com unbuffer -p (o -p é necessário para que unbuffer leia sua entrada padrão):
ping localhost | unbuffer -p grep localhost | cat
ou diga grep ao buffer por linha (se ele suportar isso):
ping localhost | grep --line-buffered localhost | cat