悔しいので自力で調べた部分をメモに残しておく。
summary モードで / すると mewl/grep どちらかで検索するが、 pattern を聞かれたときに単に RET とすると実際に検索するためのコマンドラインをかける。ここにデフォルトで入っているのは mew-prog-grep と mew-prog-grep-opts を評価した値。これらの変数を変更していなければ grep -l -e となるはず。
M-x find-function RET mew-summary-pick-with-grep とすると、 grep で(厳密には grep コマンドである必要はなく、 mew-prog-grep で指定されたコマンド)検索するときに呼ばれる関数を読める。
(defun mew-summary-pick-with-grep (prog opts pattern folder src-msgs)
と宣言されていて、 prog が mew-prog-grep で指定されたもの、 opts が mew-prog-grep-opts で指定されたもの、 pattern はそのまま pattern で、 folder は検索対象のディレクトリ名、 src-msgs が検索対象のメールのリスト。
grep に渡すファイルが多すぎてエラーになるのを防ぐために、一定数ごとにリストを分割しながら call-process で grep を呼んでいて、全部処理し終わるまで while ループで繰り返している。この call-process を呼ぶ部分が
(apply 'call-process prog nil t nil
(append opts (and pattern (list pattern)) src-msgs))
となっていて、 prog opts pattern src-msgs みたいになってこれが展開されて grep -l -e 'pattern' FILE FILE FILE ... みたいなコマンドが実行される。
この辺まで突き止めたけど肝心の問題は解決できなかった。