Cook the elbow macaroni in salted boiling water according to package directions. Drain and set aside.
In a large pot or Dutch oven, melt the butter over medium heat. Whisk in the flour to form a roux, cooking for 1 to 2 minutes until it bubbles and thickens.
Stir in garlic powder, Dijon mustard, a pinch of salt, and black pepper.
Slowly whisk in the milk and heavy cream. Cook, whisking constantly, until the mixture thickens and starts to bubble, about 5 to 7 minutes.
Reduce heat to low and stir in the shredded cheddar and Colby Jack cheeses until fully melted and smooth.
Add the cooked macaroni to the cheese sauce and stir until evenly coated.
Gently fold in the diced ham and stir to combine. Cook for another 1 to 2 minutes, just until heated through.
Remove from heat and let sit for 3 to 5 minutes before serving to allow the sauce to thicken.
Notes
Shred your own cheese for the smoothest sauce. Pre-shredded cheese can create a slightly grainy texture.
Don’t rush the roux. Cooking the butter and flour properly prevents a flour taste.
Let the mac and cheese rest before serving so it thickens naturally.
For a baked version, top with buttered breadcrumbs and broil briefly for extra texture.