Maybe I didn't understand your problem correctly, but in my opinion, you have to choose the right timeout time based on the time that passes between the removal of one tab and the other.
Furthermore, every time a tab is removed this timeout must be reinitialized.
var batchedEvents = [];
var timeOutOnRemoved;
chrome.tabs.onUpdate.addListener((tabId, changeInfo, tab) => {
batchedEvents.push([tabId, changeInfo, tab])
clearTimeout(timeOutOnRemoved);
timeOutOnRemoved = setTimeout(() => {
// loop through batched events and do app logic...
//...
batchedEvents = []
},
50)
})