работает, но кажется, что достаточно криво
Да, криво - всегда перебирается весь массив.
Можно идти от конца к началу до тех пор, пока не встретится подходящий элемент:
let lvl = 0;
for (let i = LVLS.length; i--;) {
if (LVLS[i].exp <= EXP) {
lvl = LVLS[i].lv;
break;
}
}
переделать это во что-то более красивое
const lvl = LVLS.findLast(n => n.exp <= EXP)?.lv ?? 0;
А вообще, учитывая, что уровни представлены натуральными числами без пропусков, отдельные свойства под их значения не нужны, можно искать индекс:
const LVLS = [ 10, 25, 45, 70, 100 ];
const lvl = 1 + LVLS.findLastIndex(n => n <= EXP);