I'd probably generate the list of sets into an intermediate variable and then use `*`-expansion by itself:

    doc_id_sets = (set(term_doc_ids(index_path, term)) for term in terms)
    return set.intersection(*doc_id_sets)

It's both more readable and avoids a line break in the middle of the generator expression.