Preheat the oven to 400°F (200°C) and line a rimmed baking sheet with parchment paper. Dice the onion, slice the carrots, dice the celery, mince 5 cloves of garlic (2 for the meatballs, 3 for the soup), and chop the parsley.
In a medium bowl, soak the breadcrumbs in the milk for 2 to 3 minutes. Add the egg, 2 cloves garlic, 2 tablespoons parsley, 1/4 cup Parmesan, 1 teaspoon Italian seasoning, 1/2 teaspoon salt, and 1/4 teaspoon pepper, then stir to combine.
Add the ground chicken and mix gently just until combined, about 30 seconds; stop as soon as no dry streaks remain. With wet hands, use a small cookie scoop to portion and roll about 24 one-inch meatballs, spacing them 1 inch apart on the baking sheet.
Bake the meatballs for 12 to 14 minutes, until lightly golden and the center reads 165°F (74°C) on an instant-read thermometer. Leave them on the pan until ready to add to the soup.
Heat the olive oil in a Dutch oven over medium heat. Add the onion, carrots, celery, and 1/2 teaspoon salt and cook for 6 to 8 minutes until the onion is translucent, then stir in the 3 cloves garlic for 30 to 60 seconds until fragrant.
Pour in the broth and scrape up any browned bits. Add the bay leaves, thyme, 1 teaspoon Italian seasoning, remaining 1/2 teaspoon salt, and 1/2 teaspoon pepper, then bring to a boil, reduce to medium-low, cover, and simmer for 10 minutes.
Return the soup to a gentle boil and stir in the ditalini. Cook uncovered for 6 to 7 minutes, stirring every minute or two, until the pasta is slightly firm.
Gently add the baked meatballs and simmer for 3 to 4 minutes until the pasta is tender. Stir in the spinach and cook for 1 to 2 minutes until wilted, then turn off the heat.
Discard the bay leaves and taste the broth, adding a pinch more salt or pepper if needed. Ladle into bowls with about 4 meatballs each and top with the remaining Parmesan and parsley.