Heat the butter an oil in a large Dutch oven or soup pot over medium heat. Add the onion and cook until tender, stirring often about 5 minutes then add the garlic and cook until fragrant about 2 minutes.
Whisk in the flour and cook 3 to 4 minutes stirring often then gradually whisk in the half-and-half until smooth followed by the chicken broth.
Add the broccoli, carrot, bay leaves, nutmeg and season well with salt and pepper. Bring to a simmer and cook 30 minutes, tasting halfway through and again at the end and seasoning with more salt and pepper as needed.
Remove and discard the bay leaves. Puree the soup with an immersion blender right in the pot or in batches in a blender until smooth (hold the lid down with a kitchen towel so it doesn't blow off from the steam) if you like you can leave some of the broccoli florets whole for texture.
Return the soup to the pot over low heat. Add the cream cheese and shredded cheese to the soup and whisk/stir until completely melted. Serve with additional cheese for garnish.