In a large pot over medium heat, melt 1 1/2 Tbsp butter. Add the chopped carrots, celery, and onion. Sauté for 3–4 minutes, stirring occasionally, until the onions are translucent and the vegetables begin to soften.
Add the minced garlic and sauté for 30 seconds longer, just until fragrant — don’t let it brown.
Stir in the low-sodium chicken broth, cubed russet potatoes, dried thyme, and a pinch of salt and pepper. Turn the heat to medium-high and bring to a gentle boil.
Once boiling, reduce the heat to medium, cover the pot, and simmer for 15 minutes. The potatoes should be fork-tender when pierced.
Add the chopped broccoli florets to the pot and continue cooking for an additional 5 minutes, uncovered, until the broccoli is tender but still bright green.
While the vegetables finish cooking, melt the remaining 4 Tbsp butter in a separate saucepan over medium heat to make a roux.
Stir the 6 Tbsp all-purpose flour into the melted butter and cook, whisking constantly, for 1 minute to eliminate raw flour taste.
Gradually whisk in the 3 cups milk, a little at a time, whisking vigorously to prevent lumps. Continue whisking until the mixture begins to simmer and thicken.
Stir in the 1/2 cup heavy cream and cook for 1–2 minutes until the sauce is silky and slightly thicker.
Pour the creamy mixture into the soup pot and stir well to combine with the potatoes and vegetables. Remove the pot from heat.
Stir in the 2 cups shredded sharp cheddar and 1/3 cup parmesan cheese until fully melted and smooth. Taste and adjust salt and pepper as needed.
Serve warm in bowls with your favorite toppings and enjoy!