Cite o argumento para grep , assim ls -a | grep '^\.'
A razão para isso é que o shell manipula \. e o transforma de volta em . simples, que grep então trata como um curinga de caractere único. Em caso de dúvida, sempre cite uma string que contenha (ou possa conter) um caractere especial para o shell.