Ici une explication que j'ai trouvée a posteriori après avoir galéré facile une heure : pourquoi grep semble ne pas fonctionner quand il grep sur quelque chose qui ne termine pas, et dans une autre commande ? Par exemple :
while true; do echo a; sleep 1; done | grep '' | cat
=> rien
while true; do echo a; sleep 1; done | grep ''
=> fonctionne
Dans mon cas c'était inotifywait, grep, while read mais c'est bien pareil.
La réponse est toute bête mais il fallait y penser (ou lire tout le man de grep, merci ban :)) : buffer sur stdout. grep se fait bufferiser sa sortie, ce qui est tout à fait normal. Il suffirait d'attendre plein d'événements dans le pipe pour les voir arriver. Et le fait d'avoir un terminal au bout masque ça car il bufferise pas plus qu'un ligne.
Bref, il suffit de dire "--line-buffered" à grep :)