Реакт имеет свойство оптимизировать изменение состояния компонента в одной функции, для того, чтобы избегать лишних перерендеров компонента. Обойти это можно можно с помощью асинхронных функций.
async function tap() {
setDesable(true);
//какой то код
await new Promise((resolve) => setTimeout(resolve, 1000));
setDesable(false);
}
В этой функции сначала выполняется первая функция изменения состояние setDisable(true), далее ожидание выполнения промиса, во время которого происходил перерендер. И далее, спустя 1000 мс, вызывается setDisable(false)