SpecialBlockListPager paginates using the timestamp as an offset to get the next or previous page. When paginating on a non-unique column, results can go missing between pages. (Briefly: if the limit has been reached for this page, but there are still more rows with the same value as in the final row of this page, those extra rows won't show up on the next page either, because the next page will be conditioned on having a greater value in that column.)
Not only are timestamps not unique for blocks; but blocks and autoblocks that are created at the same time have the same timestamp, so it is common for blocks to share timestamps. Whenever such blocks span two pages, those that didn't make it onto this page will be lost. (Though they can still be seen by changing the page length, filtering, going backwards from the next page, etc.)
The ipb_address column should be unique in practice; however, paginating on this column instead of timestamp would mean that we would order by username/IP, which is less useful than ordering by timestamp.
If IndexPager could paginate on multiple columns that are unique in combination, then we could paginate on the combination of timestamp and ipb_address. We would order by timestamp then address, and no rows would go missing between pages.
Since we are working on this problem for CheckUser, we should consider upstreaming it and fixing Special:BlockList at the same time.