Preheat the oven to 350 degrees F.
Combine the bread and 1 cup of the milk in a medium bowl, pressing on the bread to submerge it, and let it sit for 10 minutes.
Squeeze out most of the milk from the bread and discard the milk.
In a large bowl, add the moistened bread, the ground beef, the eggs, the onion, the parsley, 2 teaspoons of the salt, 1 teaspoon of the pepper, and the thyme and use your hands to mix until well-combined.
Form the beef mixture into 1-3/4-inch meatballs and place them in two 13x9-inch glass baking dishes.
Bake the meatballs for 30 minutes.
Let the meatballs cool slightly.
Dust the meatballs with the flour and shake off the excess.
In a large skillet over medium-high heat, add 2 tablespoons of the butter and the oil and cook until the butter melts.
Add the meatballs to the skillet.
In a bowl, whisk the wine and the tomato paste together.
Add the wine mixture to the meatballs, bring to a boil, and cook, while stirring frequently, until the liquid thickens slightly, about 5 minutes.
Add the broth to the meatballs and reduce the heat to medium.
Simmer the meatballs until the sauce thickens, about 15 minutes.
Season the meatballs with the salt and the pepper to taste.
While the meatballs are simmering, cook the potatoes in a large pot of salted water until they are very tender.
Add the remaining butter and 1 1/4 cups of the warm milk to the potatoes, then mash and stir to incorporate. Add the extra milk if needed until the desired texture is reached.
Stir the Gruyère cheese and the spinach into the mashed potatoes until the cheese melts and the spinach wilts.
Season the mashed potatoes with the salt and the pepper to taste.
Serve the meatballs over the mashed potatoes.