Как правильно удалять нужный элемент из массива?
Так как вам всегда нужно возвращать новый массив, задачу можно разделить следующим образом:
1) в новый массив копируете* все с начала до index
2) в этот же новый массив копируете все с index+1 до конца
* - для копирования отлично подходит spread operator. В теории выглядит так:const arr = [{a:1},{b:2},{c:3},{d:4}]
//допустим, вы прислали index 1 и сохранили его в переменную index, например
const newArr = [
  ...arr.slice(0, index), // клонируем все элементы до индекса
  ...arr.slice(index+1), // клонируем все элементы после индекса
  // итого: индексный элемент удален
]
Хазрат Гаджикеримов вам верно подсказал так же про filter. В комментарии привел верное решение. Давайте теперь рассмотрим ваше:if(action.type === 'REMOVE_STUDENT') {
        let newArr = state; // сохранили в newArr ссылку(!!!) на старый массив. Если вы хотели скопировать массив, то нужно было писать: let newARr = [...state] (если в state просто массив)
        newArr.splice(action.payload, 1); // здесь вы из newArr ( и из state, так как сохранили ссылку) удалили с ИНДЕКСА один элемент. Так же, внимание, вы используете sPlice, а не slice. Разницу нужно уточнить! (подсказка ниже как)
        return newArr.filter(element => element !== action.payload); // а здесь вы что вообще написали? вы сравнили element (что там? объект?) с action.payload (в которой как вы говорите индекс). Что должно быть в итоге? ;)
    }
Очень легко гуглить все незнакомые функции по типу: name MDN
в вашем случае запросы в гугл:
slice MDN (первая ссылка выдачи)
filter MDN (первая ссылка выдачи)
Теория из-за которой не происходит понимания: копирование объектов по ссылке
Ты модифицируешь state, так как массивы передаются по ссылке, по-моему filter() достаточно и нет необходимости в splice