Isso é o que é conhecido como o problema da "Tabela Mutante". O que se resume é que um gatilho de linha não tem permissão para acessar outras linhas na mesma tabela porque não há garantia de que as linhas serão atualizadas em uma ordem específica, entre outras coisas.
Em primeiro lugar, você realmente não deveria estar tentando armazenar total_income quando pode calculá-lo facilmente quando necessário. Dito isso, acho que você pode fazer o que quiser fazendo algo como
CREATE TRIGGER family_income_update
AFTER UPDATE ON family
FOR EACH ROW
BEGIN
UPDATE student
SET total_income = total_income + (NEW.income - OLD.income)
WHERE student.id_student = NEW.id_student;
END;
A ideia é modificar
student.total_income
em relação ao seu valor anterior, já que você só pode referenciar family.income
em relação ao seu valor anterior.