https://learn.javascript.ru/fetch
fetch низкоуровневая функция для работы с HTTP. Ответ 404 с точки зрения fetch ничем не лучше и не хуже чем 200 или 503 и не считается ошибкой.
Промис завершается с ошибкой, если fetch не смог выполнить HTTP-запрос, например при ошибке сети или если нет такого сайта. HTTP-статусы такие как 404 или 500, не являются ошибкой.
Вам нужно самостоятельно проверять код ответа (как в примерах выше) или использовать какую-нибудь библиотеку, например, axios.