Тут вообще нет метода лучше или хуже. Ты можешь и так и так сделать. Просто имей ввиду что с setInterval проще наткнуться на конкуренцию данных, а через setTimeout ты можешь запланировать следующий вызов когда предыдущий отработал
ну как сказать прибивается, просто у стрелки вообще нету своего зыс и она берет его снаружи и так получается, что зыс у нее всегда будет конструктором, я так понял
ну есть лексическое окружение и у него есть внутренние переменные. Что стрелочная функция, что обычная - имеют одинаковый env record и соответственно должны иметь [[зыс]] поле. Просто помимо него есть ещё поле с биндом этого зыса и оно у стрелочной изначально указывает брать зыс из внешнего лекс окр.
Промисифицируй xhr или используй fetch, потом в своём цикле в теле async функции можешь делать continue, но не так как это делаешь ты, continue нельзя засунуть в коллбек.