Indo um pouco mais a fundo, encontrei esse comportamento relatado em um bug do FreeBSD :
I've noticed some more issues with the same version of grep. I don't know whether they're related, but I'll append them here for now.
$ printf abc | grep -o '^[a-c]'
should just print 'a', but instead gives three hits, against each letter of the incoming text.
Mas não está claro para mim se ou quando isso será corrigido.