El primero:
const courses = await Course.find().populate("userId")
opera sobre la clase modelo... encuentra y completa esos campos. No execPopulateNeeded.
El segundo:
const user = await User.findById("323223ad");
const user = await user
.populate('cart.items.courseId')
.execPopulate()
Opera sobre una instancia de una clase (sobre una instancia de registro de MongoDB).
Debe especificar cuándo ejecutar populate()
... puedes encadenar muchos populate()
s.