For the record I remember seeing some missed performance opportunities with taking the min last_doc_in_block across clauses, as it could result in small-ish windows, so I ended up computing the window based on the leader for conjunctive queries, and the min last_doc_in_block across essential clauses for disjunctive queries (ignoring non-essential clauses).
(Also a reason why Lucene stores max scores on 2 levels, though if I were to do it again, I'd probably look into making the 2nd level docId-aligned (e.g. every 65k docs) rather than block-aligned.)
Follow up on Adrien Grand's comment regarding intersection