I am also writing a book editor and have been wrestling almost a year now with prosemirror-model and prosemirror-view which are close, but not quite what I need for queryable and collaborative documents. I feel your pain.
Dervied subdocuments are an antipattern that has landed me in trouble. I think your problems can be solved by having a single document represent your book and then only showing the active chapter via a nodeView linked to state. An example is the folding example.
For your ToC you can limit headings to plaintext and use a <ol><li><input value={heading}> and 2-way bind the inputs. It should be pretty easy to make a transaction to replace the heading’s text from an onchange or oninput event. If your heading schema is more complicated you’ll want <ol><li contenteditable class="ProseMirror"> with a derived schema that contains nodes: { li: { ...bookSchema.nodes.heading, ...yourImpl } }. Your 2-way binding will then require remapping transactions from the ToC editor to the book editor. You could even 2-way bind the selection if you really wanted.