Не могу понять как правильно написать цикл перебора.
Цикл не нужен, метод attr умеет принимать функцию и применять её к каждому элементу набора:
$('.hello').attr('data-class', function() {
return [...this.classList].filter(n => n !== 'hello');
});
И без jquery - цикл в явном виде тоже не нужен:
document.querySelectorAll('.hello').forEach(n => {
n.dataset.class = n.className.replace(/(^| )hello( | $)/, ' ').trim();
});
Одно непонятно - гарантируется ли, что классов будет всего два? Что если их окажется больше?
Но если точно известно, что классов будет всегда два, и порядок тоже гарантирован, то можно буквально хватать "второй" класс:
$('.hello').attr('data-class', function() {
return this.classList[1];
});
или
document.querySelectorAll('.hello').forEach(n => {
n.dataset.class = n.className.split(' ').pop();
});