Ваш второй эффект ссылается на начальное значение списка (пустой массив) из-за закрытия. Вот почему useEffect должно ссылаться на все свои зависимости во втором аргументе.
Но в этом случае, когда вы не хотите подписываться на событие webSocket при каждом обновлении списка, вы можете использовать ссылки React. в списке.
const listValue = useRef([]);
const [list, setList] = useState(listValue.current);
При установке значения:
res => {
listValue.current = res.data
setList(listValue.current);
}
И при получении списка за одноразовое использование. Эффект:
useEffect(() => {
webSocket.on('messageRecieved', (message) => {
console.log(listValue.current);
});
}, []);