Alright I've been Googling all morning and I'm not satisfied with any answers I've found.
The problem: I want users to be able to view a large amount of data.
The solution: Pagination.
The problem: I want users to be able to ACT on data that extends beyond one page.
The solution: Infinite scroll. The user can scroll to see all the results and then act on all of them (a checkbox in each table row).
The problem: I want users to be able to ACT on a large amount of data.
The solution: ???
Each method has its benefits. Pagination allows you to look through thousands of records with no browser side effects while infinite scrolling through thousands of records can bring your browser to a crawl. But infinite scroll allows you to view all of the data on one page, so it's clearer to the user that they can act on all of them at the same time.
Facets+pagination solve MOST of the problems, except acting on large amounts of data. There's no reason for a user to look through 100,000 records one by one, but it's certainly possible they want to act on them.
So what I need is a way to allow the user to view a lot of data (pagination is fine in the case of viewing), act on small amounts of data (again, pagination is fine), act on large amounts of data (spanning more than a page), and act on ALL data.