I've ended up doing it in two discrete steps:

1. open all buffers from the current (tree) search (may take a few seconds):
```
(defun notmuch-tree-show-all-messages ()
        (interactive)
        (goto-char (point-min))
            (while (and (not (eobp)) (not (get-buffer (notmuch-tree-get-message-id))))
              (notmuch-tree-show-message-out)
              (previous-buffer)
              (forward-line 1)))
```

2. multi-occur only in the opened notmuch messages:

```
(defun my-multi-occur-in-notmuch-message-matching-buffers (regexp &optional allbufs)
  "search only in notmuch messages"
  (interactive (occur-read-primary-args))
  (multi-occur-in-matching-buffers "notmuch" regexp (not allbufs)))
```
[ref\[1\]][1]

May be worth noting that just for the purpose of full-text email search, I'm testing [recoll][2] now instead, which indexes all emails ahead of time.


  [1]: https://stackoverflow.com/questions/2641211/emacs-interactively-search-open-buffers
  [2]: https://www.lesbonscomptes.com/recoll/pages/index-recoll.html