Почему массив не изменяется через цикл for..of?
Не меняется, потому, что в JS примитивные типы (число, строка) передаются «по значению». Внутри цикла оказывается копия значения, никак не связанная с оригиналом. Поменять это значение в цикле — оно не изменяется в источнике.

Другое дело объекты – они передаются «по ссылке», и их содержание можно менять: let a = [{v: 1}, {v: 2}, {v: 3}];
for (let obj of a) {
  obj.v += 1;
}
a // [{"v":2},{"v":3},{"v":4}]
Подробнее про Копирование объектов и ссылки
Цикл for..of не предоставляет доступа к номеру текущего элемента, только к его значению