In a medium saucepan, melt 1½ tablespoons of butter over medium-low heat. Add the onion and garlic and cook until softened and translucent, about 5 minutes.
Add the remaining 1½ tablespoons of butter and the flour and whisk to combine. Increase the heat to medium and continue cooking for 2 minutes, until the flour is golden brown.
Slowly whisk in the milk and vegetable stock. Bring the mixture to a boil and continue to whisk until thickened, about 3 minutes.
Remove the sauce from heat and whisk in the Gruyère and 2 ounces (60g) of Parmesan cheese until completely melted. Season with salt to taste.
Grease a medium baking dish with olive oil, then add the Brussels sprouts. Pour the sauce over the sprouts and sprinkle with the remaining Parmesan cheese.
Bake for 20 minutes, until the sauce is bubbly and browned.