I would use option 2 - A single repeating group that has filters
put the filters directly to the search constraints (mark the checkbox "ignore empty constraints) - the bubble’s fetch time, in this case, is very acceptable
I see the idea behind loading it all once and keeping it hidden, but it can increase the page size and load time as the DB grows - and any DB update can trigger cascading updates on the page.
But if you know this DB won’t grow exponentially, you can load all data in a hidden RG (like inside a popup that never is opened), and then you create your RG on the page using the hidden RG’s list of items - and then add a :filtered expression to filter based on your filters