Проблема здесь в том, что расширенное индексирование создает копию массива, и только копия модифицируется. (Это в отличие от базовой индексации, которая приводит к просмотру исходных данных.)
При прямом назначении расширенного среза
a[ind_row, 1] = 3
копия не создается, но при использовании
a[ind_row, 1][1] = 5
часть a[ind_row, 1]
создает копию, а часть [1]
индексирует эту временную копию. Копия действительно изменена, но, поскольку у вас нет ссылок на нее, вы не можете видеть изменения, и она сразу же собирается сборщиком мусора.
Это аналогично нарезке стандартных списков Python (которые также создают копии):
>>> a = range(5)
>>> a[2:4] = -1, -2
>>> a
[0, 1, -1, -2, 4]
>>> a[2:4][1] = -3
>>> a
[0, 1, -1, -2, 4]
Решение проблемы для этого простого случая, очевидно,
a[ind_row[1], 1] = 5
Более сложные случаи также можно переписать аналогичным образом.