Почему тип ответа передается в метод как переменная?
Чтобы ты не копипастил везде конструктор ответа, передаётся болванка. И да, не "в большинстве", а в асинхронных/неблокирующих, потому что в синхронных классы ответов примитивные и используются только после завершения ответа.
Это объект, который ты должен заполнить. В функциональных языках это вполне могло бы быть возвращаемое значение, но его сложно передать в иную асинхронную функцию. Синтетический пример:asyncSetHeaders(resp)
Из менее синтетических примеров - необходимость сделать асинхронный запрос, чтобы в итоге сформировать response