Place a large, heavy bottomed pot over medium heat. Add the olive oil and butter to the pot and heat until the butter melts. Add the onions, thyme sprigs, bay leaf and garlic. Sprinkle the onion mixture with 1 teaspoon salt and 1/2 teaspoon pepper. Cook over medium heat, stirring frequently, until the onions are soft and golden brown, 45 minutes.
Pour in the Marsala to deglaze the pot, stirring to scrape up any bits at the bottom. Add the beef stock and simmer until the onions are very soft and the soup has reduced slightly, about 35 minutes. Use tongs to remove and discard the thyme stems, bay leaf, and garlic cloves.
Preheat the broiler to high. Put 4 oven-safe serving bowls on a baking sheet.
Put 4 slices of bread on a baking sheet. Toast the bread under the broiler until crispy and slightly golden brown, 1 to 2 minutes.
Ladle the soup into the oven-safe bowls (about 1 1/2 cups per bowl). Top each bowl with a toasted slice of bread. Top with a slice or two of mozzarella. Mound 1/2 cup of Gruyere on top of each bowl. Place the baking sheet of bowls under the broiler until the cheese is melted and slightly browned, 1 to 2 minutes. Serve immediately.