Не изменять состояние , сделать копию состояния и затем выполнить операции с ним
case 'COMPLETE_TODO' :
return {
...state,
todos: state.todos.map(obj=> ({...obj, status: obj.id == action.value ? "COMPLETED" : obj.status}))
}
map
создать новый массив, ...
распространенный синтаксис создает неглубокую копию, если ваш объект глубже, чем на один уровень, то вы должны сделать глубокий клон,
Для глубокого клонирования вы можете использовать
let deepCopy = JSON.parse(JSON.stringify(state.todos))