Melt butter in a large Dutch oven over medium heat. Add onions and garlic, stir and sauté until soft - 3 to 4 minutes. Sprinkle in all-purpose flour and whisk continuously for 1-2 minutes.
Whisk in the chicken stock, milk, and cream. Bring to a boil then reduce heat to medium-low.
Add the broccoli and carrots. Cook for 20-25 minutes or until the broccoli is tender.
Remove one cup of soup and puree with an immersion blender (optional for smoother soup). Return pureed soup to the pot. For a chunkier soup, skip this step.
Reduce heat to low and stir in the shredded cheddar cheese, one handful at a time. Stir in nutmeg, salt and pepper.
Serve with crusty bread or in a bread bowl.
Notes
Choose firm, bright green broccoli florets without any yellowing or wilting. Fresh broccoli gives the best texture and flavor. If you want to include stems, peel the tough outer layer first to avoid a fibrous bite.
If using frozen broccoli: Partially thaw to reduce excess moisture, which can water down your soup. Frozen broccoli cooks faster than fresh. Add it during the final 5–7 minutes of simmering to prevent overcooking and mushiness.
Use sharp or extra-sharp cheddar for that bold, cheesy kick. Always use freshly shredded cheese. Bagged pre-shredded varieties often contain anti-caking agents, which can make your soup grainy rather than velvety smooth. If you love bold flavors, you can also mix in a bit of Parmesan or Gruyère for added depth.
Whole milk and heavy cream provides the creaminess that we love about broccoli cheese soup, it is also less likely to curdle due to it’s higher fat content. If you prefer a lighter option, half-and-half works well. Steer clear of skim milk, the lower fat content will change the overall texture.