In a large soup pot or Dutch oven, melt the butter over medium heat. Add the diced onion and garlic and cook for about 4 to 5 minutes, stirring often, until softened. Add the garlic and cook for an additional 30 seconds until fragrant.
Sprinkle the flour evenly over the softened onions & garlic. Stir constantly for 1 to 2 minutes. The mixture should look thick and slightly golden.
Slowly whisk in the chicken broth, a little at a time, making sure the mixture stays smooth. Once the broth is incorporated, whisk in the milk. Bring the soup to a gentle simmer, stirring frequently, until it begins to thicken.
Add the chopped broccoli to the pot. Reduce the heat to medium-low and simmer for 15 to 20 minutes, stirring occasionally, until the broccoli is tender.
Take at least half of the soup and put it in a blender (or use the immersion hand blender) to make the soup creamier leaving some larger broccoli pieces in the soup. Return blended broccoli to the pot.
Stir in the heavy cream and cream cheese chunks. Reduce the heat to low and stir until the cream cheese is incorporated. Add the shredded cheddar cheese a handful at a time, stirring gently until fully melted before adding more. Do not let the soup boil once the cheese is added.
Season with salt & pepper. Taste and adjust seasoning as needed. Serve hot with crusty bread, croutons or crackers.