Добавьте лог сразу после установки нового состояния:
setEndTime(endTimeUnix * 1000);
console.log('endTime', endTime);
const timerInterval = setInterval(timer, 1000);
Вы увидите, endTime undefined. Потому что установка нового стейта не гарантирует, что это произойдет сразу, но гарантирует новое значение при следующем рендере.
Если всё же хочется что-то делать сразу после установки нового стейта - то можно переписать компонент в классовом стиле - там у this.setState вторым параметром передается callback-функция, которая выполняется после установки нового значения стейта.