Preheat your oven to 350°F. While it heats, trim the tough ends from the asparagus and cut into 1-inch pieces, then cut the bread into ½-inch cubes for even soaking. Dice the ham into bite-sized pieces and cut the provolone cheese into small chunks. Having everything prepped and ready before you start assembling will make the process smooth and efficient.
Bring a pot of salted water to a boil and add the prepared asparagus pieces. Cook for exactly 3 minutes—this brief blanch softens the asparagus while keeping it from becoming mushy during the longer baking time. Drain thoroughly and set aside to cool slightly.
Spray a 9x13 inch baking dish with cooking spray. Spread half the bread cubes evenly on the bottom, then layer with half the diced ham and half the cheese. Top with the blanched asparagus from Step 2, distributing it evenly across the bread layer. This layering strategy ensures every bite has asparagus, ham, and cheese distributed throughout.
In a large bowl, whisk together the eggs, milk, and half and half until well combined. Add the salt, pepper, Dijon mustard, and a pinch of nutmeg, whisking until smooth. I find that letting the eggs sit at room temperature before whisking ensures a more uniform, silky custard that soaks into the bread evenly.
Slowly pour the custard mixture from Step 4 over the layered ingredients, allowing it to soak into the bread gradually. Once the custard is absorbed, top with the remaining half of the bread cubes, then scatter the remaining ham and cheese over the top. This creates a golden, textured top while keeping the bottom layers tender and custard-soaked.
Place the baking dish in the preheated 350°F oven and bake for 45 minutes, until the top is golden brown and a knife inserted into the center comes out clean or with just a few moist crumbs. The bread pudding should be set but still slightly custard-y in the very center—it will continue to firm up as it cools slightly.