Esto es lo que se conoce como el problema de la "tabla mutante". Todo se reduce a que un activador de fila no puede acceder a otras filas en la misma tabla porque no hay garantía de que las filas se actualicen en un orden específico, entre otras cosas.
En primer lugar, no debería tratar de almacenar ingresos totales cuando puede calcularlos fácilmente cuando sea necesario. Dicho esto, creo que puedes hacer lo que quieras haciendo 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;
La idea es modificar student.total_income
en relación con su valor anterior, ya que solo puede hacer referencia a family.income
en relación con su valor anterior.