const result = Object
.entries(arr.reduce((acc, n, i) => ((acc[n] = acc[n] || []).push(i), acc), {}))
.map(n => n[1].length > 1 ? { label: n[0], indexes: n[1] } : n[0]);
если массив может содержать значения, которые, будучи различными, имеют одинаковый строковый эквивалент, то вместо обычного объекта используем Map:
const result = Array.from(
arr.reduce((acc, n, i) => (acc.set(n, acc.get(n) || []).get(n).push(i), acc), new Map),
([ label, indexes ]) => ~-indexes.length ? { label, indexes } : label
);