Наблюдаемые являются асинхронными по своей природе. Вызов подписки будет выполняться в другом потоке, в то время как остальные инструкции в методе будут продолжать выполняться в основном потоке. Вам нужно дождаться завершения асинхронного действия, прежде чем запускать следующее. Вы можете сделать это, поместив isntructions внутри подписки, или, что еще лучше, использовать параметр onCompleted, который следует после параметра (err), например
this.personService.getPersons().subscribe(persons => {
const personsWithPets = persons.flatMap(person =>
this.petService.getPetsByPersonId(person._id)
.subscribe(petsData => {
person.pets = petsData;
return person;
},
(err) => {
console.log(err);
},
() => {
this.persons = personsWithPets;
}))
});