Melt the butter in a large pot or Dutch oven over medium heat. Add the olive oil, onions and sugar. Cook, stirring occasionally, until onions are soft, lightly browned and caramelized, about 30 minutes.
Add the salt, pepper and flour and cook, stirring, for 1 minute. Stir in the beef broth and add the bay leaf to the pot. Increase heat to bring to a boil. Reduce heat to medium-low and simmer for 30 minutes.
Taste the soup and season with more salt and pepper as needed.
Place baguette slices on a baking sheet and toast under the broiler for 2 to 3 minutes, until lightly browned.
Spoon soup into 4 oven-safe bowls. Place 2 baguette slices on top of each bowl of soup. Sprinkle on grated Gruyere and Parmesan.
Place bowls on a rimmed baking sheet and transfer to the oven. Heat under the broiler for 2 to 3 minutes, until cheese is melted and lightly browned. Serve.