Only rows that pass the filter can be visible in the view. The view it has to determine the possibly visible rows from the whole set before it can know the actually visible rows. That determination is done by filterAcceptableRows().
Every time you fetchMore() or otherwise manipulated the data the entire set of fetched rows will be refiltered because that is the only way to know if the changed data has altered what might be visible and therefore what is actually visible. This is is especially true if the view is sorting data but the source data is not sorted.
I would be surprised if the proxy filtered more rows than were currently fetched in the source model. If your source model properly implements canFetchMore() and fetchMore() then i would expect this to just work.
If you have 2 million top level items then you almost certainly should be considering filtering at the time of selection from the database rather than in the in-memory model and view.
Bookmarks