"Оптимизировать" - в смысле сократить? Вот так можно:
const duplicates = Object.fromEntries(Object
.entries(arr.reduce((acc, n, i) => (
(acc[n] ??= []).push(i),
acc
), {}))
.filter(n => n[1].length > 1)
);
Если среди значений массива могут быть такие, которые, будучи различными, имеют одинаковый строковый эквивалент, то обычный объект следует заменить на
Map
:
const duplicates = new Map(Array
.from(arr.reduce((acc, n, i) => (
acc.set(n, acc.get(n) ?? []).get(n).push(i),
acc
), new Map))
.filter(n => n[1].length > 1)
);