В задаче reduce, наверное, не нужен вовсе.
Я бы разбил по дефису на слова в массив:
'aBc-dEf-GH' => ['aBc', 'dEf', 'GH']
Метод массива
map()
пробежит по каждому элементу, возвращая новый.
Каждое слово составить заново: первую букву сделать большой, остальные маленькими:
'dEf' => 'Def'
Исключение для самого первого — там все маленькие должны быть:
'aBc' => 'abc'
function camelize(str) {
return str.split('-')
.map((word, i) => i ? word.substr(0, 1).toUpperCase() + word.substr(1).toLowerCase() : word.toLowerCase())
.join('');
}