Place milk and eggs in a medium bowl and beat to combine. Tear bread into small pieces and stir into milk mixture. Let stand until milk is combined and bread is falling apart, about 5 minutes.
In a large bowl, combine ground beef, grated onion, parmesan, parsley, salt, and pepper. Add soaked bread and use your hands to gently, but thoroughly, combine. Form the mixture into 1-1/2" balls, about the size of golf balls.
Heat oil in a dutch oven or heavy-bottomed pot over medium-high heat. When shimmering hot, add half of the meatballs in a single layer and brown on all sides (they'll be cooked through later). Gently transfer to a plate, and repeat with remaining meatballs.
To make sauce:
Wipe out the dutch oven with a paper towel and add remaining olive oil along with onion. Cook on medium heat until onion is soft and translucent, but not browning, about 6 minutes. Add garlic and cook until fragrant, about a minute more. Add tomatoes and bring to a boil. Puree the sauce with an immersion blender or with a regular blender (in batches, unless it has steam vents for pureeing hot foods). Return sauce to pot and gently add meatballs. Simmer over medium-low for about 25 minutes, until meatballs are cooked through and sauce thickens. Season to taste with salt, and stir in basil just before serving.
Meanwhile, cook spaghetti in salted, boiling water until al dente according to package directions. Serve spaghetti topped with sauce and meatballs, with a showering of freshly grated parmesan.