Há mais de uma maneira de fazer isso. Isso deve manter o número total de processos executados no mínimo:
find . -name \*.xml -print0 \ # List of *.xml files (NUL-terminated)
| xargs -0 grep -Zli 'string[12]' \ # is input to first grep, which sends (NUL-term'd)
| xargs -0 grep -Li 'string[34]' # file list to second grep
Obrigado Matt Gibson por nos lembrar do -Z
flag para o GNU grep.