Как добавлять в std::vector во время итерирования?
Возможно не самый элегантный, но достаточно предсказуемый способ -- разделить это на отдельные этапы.for (auto obj = Organisms.begin(); obj != Organisms.end(); obj++)
{
    (*obj)->eat();
}
Organisms.erase(
    std::remove_if(Organisms.begin(), Organisms.end(),
        [](organism_ptr obj){obj->is_eaten();}
        ),
    Organisms.end()
    );
organisms_t new_organisms;
for (auto obj = Organisms.begin(); obj != Organisms.end(); obj++)
{
    organism_ptr org = (*obj)->reproduce();
    if (org)
        new_organisms.push_back(org);
}
Organisms.insert(Organisms.end(), new_organisms.begin(), new_organisms.end())
for (auto obj = Organisms.begin(); obj != Organisms.end(); obj++)
{
    (*obj)->move();
}
А в чём вопрос?
(и что должно означать "нужно знать обо всех существующих объектах."?)
Некоторые ваши операции будут делать итератор obj недействительными, тогда obj++ закончится ... неизвестно чем.
В таких случаях нужно бы цепочку итераторов пробежать с начала, или от какого-то фиксированного места ранее.
Для таких вещей лучше (удобнее) переписать это всё не как цикл for, а как цикл while.