Почему ArrayList пустой?
Так запрос же асинхронный. То есть вы его запускаете и говорите "вот когда данные придут - запиши их в список". И не дожидаясь пока запрос выполнится - возвращаете список (который, разумеется, пустой - запрос же еще в процессе выполнения).

Поэтому, если уж вы начали использовать асинхронные запросы - надо жить в асинхронном мире дальше, везде протаскивая Mono и Flux.

Либо переходить на Kotlin с его корутинами (которые прекрасно интегрируются с Mono/Flux)
Тут я вижу два варианта.
1. Вы никакой асинхронщины не хотите, но вам попался асинхронный клиент. Тогда нужно что-то типа такого сделать:
public List<Response> getAdditionalData(List<ExcelModel> excelList) {
        return Flux.fromIterable(excelList) // Превращаем лист во флюкс
                .flatMap(excel -> webClient.get()  // по каждому элемену делаем асинхронный запрос
                        .uri(sybase + excel.getTransactionID())
                        .retrieve()
                        .bodyToMono(Response.class))
                .collectList() // Собираем поток в лист. Тут получается Mono<List<Response>>
                .block(); // Блокируем тред и ждем завершения. Можно в скобочках указать сколько ждать.
    }

2. Либо вы пересаживаетесь на асинхронный стек, тогда вам нужно флюкс и отдавать, как и написал Михаил. И подписка на него дожна быть, скорее всего, где-то выше по стеку.
public Flux<Response> getAdditionalData(List<ExcelModel> excelList) {
        return Flux.fromIterable(excelList)
                .flatMap(excel -> webClient.get()
                        .uri(sybase + excel.getTransactionID())
                        .retrieve()
                        .bodyToMono(Response.class));
    }