grep -r foo *
não procura correspondências em arquivos ou diretórios ocultos,
também *
é expandido pelo shell, então você pode acabar com um erro Argument list too long quando houver muitas entradas no diretório atual, ou algum outro erro ou mau comportamento se o nome do alguns dos arquivos ou diretórios começam com um caractere traço.
Invocação grep -r foo .
não tem as falhas acima
Atualizado:
Outra diferença: a página man do grep (@ fedora17) diz:
-r, --recursive
Read all files under each directory, recursively, following symbolic links only if they
are on the command line. ...
Haverá também uma diferença quando você executar este comando em um diretório vazio:
$ grep -r foo *; echo $?
grep: *: No such file or directory
2
$ grep -r foo .; echo $?
1
$