Разгледахте ли AddToSet метод, ако използвате това в комбинация с функцията за актуализиране вместо тази за замяна, тя трябва да поддържа по-добър контрол върху вашата атомарност.
var updateBuilder = Builders<Item>.Update.AddToSet(items => items.SubItems, new SubItem());
collection.UpdateOne(itemFilter, updateBuilder);
Така е във вашия случай.
public Task Save(string itemId, SubItem subItem)
{
var itemFilter = Builders<Item>.Filter.Eq(v => v.Id, itemId);
var collection = _db.GetCollection<Item>("Items");
var updateBuilder = Builders<Item>.Update.AddToSet(items => items.SubItems, subItem);
collection.UpdateOneAsync(itemFilter, updateBuilder, new UpdateOptions() { IsUpsert = true }).Wait();
}