Потому что visible это равносильно display, есть 2 состояния, виден и невиден, промежуточных значений нет, соответственно transition работать не будет.
если хотите чтобы и при скрытии с задержкой работало нужно использовать animate
let animateBlock = blockEl.animate([
{opacity: 1},
{opacity: 0}
], {duration: 300, easing: 'ease-in-out', fill: 'forwards'});
animateBlock.addEventListener('finish', () => { blockEl.classList.add('hiddenBlock') })