When querying and populating subdocuments, how can I detect and handle subdocuments that were deleted?

I have a Data Model that contains an array of ObjectIDs for another Data Model.

var ProductSchema = new Schema({
  images: {
    type: [{
        type: Schema.ObjectId,
        ref: 'Image'
    }],
    default: []
  },
});

When I query Products and populate Image records, how can I detect when some Image records have been deleted?

I guess you mean that some of the images in your array might have had it's object removed so you want to check for that. What you can do is to check this in the save hook, something like this:

ProductSchema
    .pre('save', function(next) {
        var Image = mongoose('Image');
        this.images.forEach(function(image) {
            Image.objects.findById(image, function(err, image) {
                if (!image) {
                    // This would mean the object has been removed so 
                    // the saved id is missing a reference...
                    ...
                }
            })
        })
        next();
    });