Где здесь утечка памяти?
Во первых, вы неправильно используете анонимные функции, напримерconst startTimer = (){ ... }
и все остальные.
Анонимные функции можно использовать только в ситуациях, когда их вызывают "не по имени" для сохранения контекста. Например, аргументом forEach().
В данной ситуации лучшей синтаксической формы ничего не придумали:function startTimer(){ ... }Второй момент for ( const key in _headers ) {
        if ( {}.hasOwnProperty.call( _headers, key ) ) {
            headers.append( key, _headers[ key ] );
        }
    }
и конкретноif ( {}.hasOwnProperty.call( _headers, key ) )
Вы в цикле каждой итерацией создаете новый объект, это крайне не рациональное использование метода hasOwnProperty()
по мне if (_headers != null && !!_headers[key] )
может выглядело бы не так красиво, за то потребляет памяти по-меньше.Третий момент.catch( console.error )
Вы можете немного сэкономить памяти использовав как раз по назначению анонимную функцию.catch( e => console.error(e) )
В этом случае интерпритатор не будет искать ссылку на console.error при создании каждого промиса, и будет искать, соответственно, только в исключитальных ситуациях.Четвертый момент
Поменьше пользуйтесь ключевым словом const, особенно, внутри методов и функций. Во-первых, так как они не выгружаются из памяти. Во вторых, const не дает никаких преимуществ в производительности, только лишь накладывает на интерпритатор обязанности следить чтобы ее случайно не перегрузили.
Проверьте на всякий случай, что у вас в любом случае вызывается response.text()  или аналоги. Если не вызовется, возможен memory leak как минимум в V8.
А вообще в Chrome же можно делать снимки кучи.