Preheat the oven to 400°F. Spread the cubed bread over a baking dish or sheet pan in a single layer. Place in oven and bake until lightly toasted, about 7 to 8 minutes. Remove and set aside. Lower the oven temperature to 350°F.
In a large bowl, whisk together the eggs, milk, cream, salt and pepper. Set aside.
Bring 2 quarts of salted water to a boil (1 1/2 teaspoons of salt). Add the cut asparagus to the boiling water. Return to a boil and blanch the asparagus for 2 to 3 minutes. Remove the asparagus to a bowl of ice water to shock the asparagus and stop the cooking. Drain and set aside.
Spread butter over the inside of a 8x11x2¼-inch casserole dish. Spread half of the bread cubes over the bottom of the casserole dish. Sprinkle half of the ham cubes over the bread. Sprinkle half of the asparagus and red onion over the ham. Sprinkle everything with half of the Cheddar cheese. Pour half of the milk egg mixture over everything.
Repeat the process. Add another layer of cubed bread, ham, asparagus, red onion, cheddar cheese, and milk egg mixture. Press down on the mixture with your (clean) hands to help the bread soak up more of the milk mixture. (At this point you can make up to a day ahead, cover and refrigerate until ready to cook.)
Cover casserole dish and place in the 350°F oven for 40 minutes. Bake uncovered for an additional 20 to 30 minutes, until the egg mixture is set. Test by inserting a sharp knife into the center of the casserole. If the inside is still runny, it's not cooked through yet and needs more time in the oven. If the top starts to get too browned, you can cover again.