Как возвести в квадрат каждый элемент в массиве?
Минутка лишних усложнений и новых концепций.

В JavaScript примитивные значения (числа, например) копируются/передаются «значением», не сохраняя никакой связи с оригиналом. А объекты (например, массив) передаются «ссылкой» на оригинал.

Судя по неудачной попытке, был расчёт, что изменив elem, изменится и его «оригинал» – элемент массива. Но нет. Число возвели в квадрат, но в массиве всё осталось по-прежнему.

Будь elem не числом, а объектом, трюк сработал бы. примерlet arr = [ {x: 1},  {x: 2},  {x: 3},  {x: 4},  {x: 5} ];

for (let elem of arr) {
  elem.x = elem.x ** 2;
}
// [ {"x": 1}, {"x": 4}, {"x": 9}, {"x": 16}, {"x": 25} ]

А в случае с примитивами (числом, строкой) надо как-то вложить квадратное значение обратно в массив в нужную ячейку. Этого-то и не хватает в коде.
Когда ты пытаешься поменять внутри цикла каждое значение элемента, типа:
elem = elem ** 2
ты по факту меняешь само число. Это все равно, что сказать 2 является 4. Невозможно изменить числовой тип данных в JS, так как они иммутабельны (то бишь неизменяемые). Нужно менять значения по ключу (в случае массивов - по индексу), так как тогда ты не пытаешься изменить само число, а меняешь значения в массиве, которое просто располагается под определенным индексом. По этому и возникает ошибка. Обращайся к значениям по индексу типа:
const collection = [1, 2, 3, 4, 5];
for (let i in collection) {
  collection[i] = collection[i] ** 2;
}
console.log(collection); // [1, 4, 9, 16, 25]