Как правильно склонировать объеты?
Без цикла никак.
const clone = (base, count, key = 'id') => [...new Array(count)].map((_, index) => {
  const cloned = { ...base };
  cloned[key] += index;
  
  return cloned;
});

const a = {
  id: 7,
  type: 'apple'
};
console.log(clone(a, 8));
console.log(a);
/**
[
  { id: 7, type: 'apple' },
  { id: 8, type: 'apple' },
  { id: 9, type: 'apple' },
  { id: 10, type: 'apple' },
  { id: 11, type: 'apple' },
  { id: 12, type: 'apple' },
  { id: 13, type: 'apple' },
  { id: 14, type: 'apple' }
]
{ id: 7, type: 'apple' }
*/
вместо { ...obj } используй JSON.parse(JSON.stringify(obj)), если объекты сложные (их свойства являются также объектами), но без методов или что-нибудь типа https://lodash.com/docs/4.17.15#cloneDeep если есть методы.
Ну а так - использоавние цикла тут логично, просто можно его немного поменять:
for (let i = 0, id = obj.id+1; i < count; i++, id++) {
    const clone = {...JSON.parse(JSON.stringify(obj)), id}
    objects.push(clone);
  }