Почему не считывается value инпута?
Вы считываете значения инпута однократно, в момент выполнения функции test. Для того чтобы это работало как вы хотите - нужно вешать обработчик на инпут, реагирующий на изменение значения в нем
let test = () => {
let inp = document.querySelector('input')
let warn = document.createElement('div')
let att = inp.getAttribute('value')
inp.id = 'inpId'
let inpId = document.getElementById('inpId');
inpId.addEventListener("input", ()=>{
if (inpId.value > 3) {
    warn.style.display = 'none';
}
})
warn.classList.add('hi');
warn.innerHTML = 'Тестовая штука';
inp.insertAdjacentElement('afterend', warn);
}
test();
ну и скрипт должен располагаться ниже инпута в потоке html
Так ты сначала создаёшь элемент, вставляешь его в html, а потом у объекта меняешь атрибут, а то что в html уже там. Нужно либо сначала делать проверку, а потом делать insertAdjacentElement, либо перед скрытием делать querySelector вставленного элемента