Finely grate 1/4 cup yellow onion for the meatballs. Dice the remaining medium onion, slice carrots into 1/4 inch rounds, and slice celery the same thickness. Mince 2 cloves garlic for meatballs and 4 cloves for soup, chop 1/4 cup parsley and split in half, and grate 2/3 cup Parmesan and split the same way. Line a rimmed baking sheet with parchment paper.
In a large mixing bowl, stir together 1/2 cup breadcrumbs and 2 tablespoons milk and let sit for 2 minutes. Add ground turkey, egg, 1/3 cup Parmesan, grated onion, 2 minced garlic cloves, 2 tablespoons parsley, 1 teaspoon Italian seasoning, 3/4 teaspoon salt, and 1/4 teaspoon pepper. Mix gently just until combined.
Lightly wet your hands, then use a 1 tablespoon cookie scoop to portion the mixture and gently roll each portion into a smooth 1 inch ball. Place on the lined baking sheet—you should end up with about 28 meatballs. If you have time, chill the tray for 10 minutes.
Heat 2 tablespoons olive oil in a large Dutch oven over medium-high heat until it shimmers. Add half the meatballs with a little space between them and cook 4 to 5 minutes, turning gently, until browned on most sides. Transfer to a clean plate with a slotted spoon and repeat with the second batch, leaving the browned bits in the pot.
Reduce heat to medium and add the remaining 1 tablespoon olive oil to the same pot. Add diced onion, carrots, and celery and cook 6 to 8 minutes, stirring often, until the onion is soft and translucent. Stir in 4 minced garlic cloves and cook 30 seconds until fragrant, scraping up browned bits.
Pour in 8 cups chicken broth and add 1 teaspoon Italian seasoning, 1/2 teaspoon dried thyme, the bay leaf, 1/2 teaspoon salt, and 1/4 teaspoon pepper. Raise heat to high and bring to a boil, about 5 to 6 minutes.
Gently return the browned meatballs and any juices on the plate to the pot. Reduce heat to medium-low so the broth bubbles gently, partially cover, and simmer for 10 minutes. Confirm the center of a meatball reads 165°F with an instant-read thermometer.
Stir in 3/4 cup dried orzo and keep the soup at a steady simmer. Cook uncovered for 9 to 11 minutes, or according to package directions, until al dente, stirring every couple of minutes so the orzo does not stick.
Remove the pot from the heat and fish out the bay leaf. Stir in the baby spinach a handful at a time until wilted, about 2 minutes. Stir in 1 tablespoon lemon juice, then taste the broth and add more salt and pepper if needed.
Ladle the soup into warm bowls, making sure each serving gets plenty of meatballs. Top each bowl with a sprinkle of the remaining Parmesan and fresh parsley, and serve right away while steaming hot.