Потому, что функции-сеттеры отданы, но они потеряли контекст. Вам следует отдать данные в fetchCryptoRating, вернуть обновлённые значения из неё - в реакт компоненте в эффекте их получить обратно. И уже с этими новыми данными вызывать setTables и тд. Именно в эффекте.
Кстати, из эффекта нужно возвращать функцию, которая почистит интервал или таймаут (clearTimeout)
useEffect(() => {
const intervalId = setInterval(() => {}, 1000)
return () => clearInterval(intervalId)
}, [])