Basta spostare il reindirizzamento al primo comando, ovvero
find ... 2>/dev/null | xargs ...
Oppure puoi racchiudere tutto tra parentesi:
(find ... | xargs ...) 2>/dev/null
Per reindirizzare stderr a /dev/null usa:
some_cmd 2>/dev/null
Non hai bisogno di xargs qui. (E tu non lo vuoi! Dal momento che esegue la suddivisione delle parole)
Usa l'opzione exec di find:
find . -type f -name "*.txt" -exec grep -li needle {} +
Per sopprimere i messaggi di errore utilizzare il -s opzione di grep :
Da man grep :
-s, --no-messagesElimina i messaggi di errore relativi a file inesistenti o illeggibili.
che ti dà:
find . -type f -name "*.txt" -exec grep -lis needle {} +