Heat olive oil and butter together in a large pot over medium heat. Add thinly sliced onions and cook slowly for 25-30 minutes, stirring frequently, until caramelized and deep golden brown.
Stir in minced garlic and fresh thyme leaves. Cook for 1-2 minutes until fragrant.
Pour in beef broth, add bay leaf and Worcestershire sauce. Stir to scrape up browned bits. Bring to a gentle boil, then reduce heat and simmer for 30 minutes.
Preheat oven to 400°F (200°C). Arrange baguette slices on a baking sheet and toast for 5-7 minutes until crisp and golden.
Ladle soup into oven-safe bowls. Place toasted baguette slices on top, sprinkle shredded Gruyère and mozzarella cheese over bread. Broil for 3-5 minutes until cheese is bubbly and golden brown.
Carefully remove bowls from oven, let cool for a minute, then serve piping hot.