todo - объёкт, объекты передаёются по ссылке, меняя a - ты меняешь его в исходном, чего делать в React нельзя.
const newTodo:ITodo[] = prev.map(todo=>{
if(todo.id === id){
console.log('+')
return {...todo, completed: !todo.completed, a: todo.a+1};
}else{console.log('-')}
// console.log(todo)
return todo
})
Не знаю правда связанно ли это с твоей проблемой, но такая хрень может привести к множеству странных эффектов.)