Отвечу так, как сам понимаю, без претензий на экспертство.
Сама функция в вашем примере — синхронная. Внутри данной функции вызывается fetch — он асинхронный.
Вызов функции и её выполнение — это блокирующий код, он выполняется синхронно, и останавливает поток, пока не отработает функция.
Но суть в том, что идея отрабатывания данной синхронной функции в том, чтобы поместить в event loop асинхронный запрос (который возвращает promise), обработчик которого запускается и не блокирует основной поток, — и только. Сама функция же, как синхронная, возвращает то, что вы ей даете вернуть, — в данном случае undefined.
Если бы вы записали функцию, как асинхронную, и перед fetch использовали await, то данная функция как раз и возвращала promise, который предполагал бы полное исполнение fetch до выполнения самой функции, то есть resolve'а promise функции.
const getData = async () => {
await fetch('адресДаты').then((resp) => {
resp.json()
})
.then((data) => {
return data.data
})
}