Во-первых, там где осознано нарушаются правила линта, указать это служебным комментарием линтера не так, уж и плохо.
Но все же есть 2 способа обойтись без комментария:
1. Просто затыкаем линтер, но по сути делаем то же самое, то есть мутируем аргумент acc, но по хитрому:
var items = Object.values(msg).reduce((acc, curr) => {
curr.category.forEach(item => Object.assign(acc, {[item.id]: item.cat_name}));
return acc;
}, {});
2. пишем действительно иммутабельно, ловим небольшой оверхед по производительности, зато получаем более надежное решение:
const items = Object.values(msg).reduce(
(acc, curr) => Object.assign({}, acc, curr.category.reduce(
(acc, item) => Object.assign({}, acc, {[item.id]: item.cat_name}),
{})),
{});