Why batching matters here
GmailApp.search returns an array of GmailThread objects. GmailApp.markThreadsRead accepts that entire array and issues one underlying API call for all of them. The alternative — iterating over threads, calling getMessages on each, then calling markRead on each message — fires one API call per message. Gmail quota for Apps Script is 20,000 calls per day on a personal account. A notification label with 1,500 unread messages eats 7.5% of your daily budget in a single run. The batch call costs a fraction of that regardless of thread count.
The 100-thread limit per search call is a hard cap in the GmailApp API, which is why the script pages: start increments by however many threads actually came back, and the loop exits when the result is shorter than the requested batch (meaning there are no more pages).