Heat the olive oil in a large pot or Dutch oven over medium heat. Add the onion and ground beef. Cook, breaking up the meat as it browns, for about 6–7 minutes or until no pink remains. Drain excess fat if needed.
Stir in the garlic and cook for another 30 seconds, just until fragrant. Add the crushed tomatoes, tomato purée, Italian herbs, paprika, and Worcestershire sauce. Stir to combine and bring to a gentle simmer for 5 minutes.
Add the macaroni and beef stock. Stir well, then raise the heat to bring the mixture to a boil. Reduce to low heat, cover, and simmer for 15–20 minutes, stirring occasionally, until the pasta is tender and most of the liquid has absorbed.
Remove from heat and stir in about three-quarters of the cheddar cheese. Season with salt and pepper to taste.
Sprinkle the remaining cheddar and Parmesan on top. Cover for a few minutes to let the cheese melt. Serve warm.