Move oven rack to upper-middle position and preheat oven to 375 degrees F. Lightly grease a 9x13-inch baking dish with nonstick cooking spray; set aside.
Add potatoes to large pot and enough water to cover them by 1 inch. Set the heat to high and bring potatoes to boil. When boiling, reduce heat to medium and cook until tender, about 12-18 minutes.
While potatoes boil, make the filling. In a large skillet over medium-high heat melt butter. Add onion and saute until opaque and starting to turn light brown around the edges, about 4-5 minutes.
Add ground beef, salt, and pepper and use a wooden spoon to break the meat up into small pieces. Cook, stirring often, until the beef is cooked through, about 8-10 minutes. Stir in flour and tomato paste and cook for 2 minutes.
Stir in beef broth, milk, Worcestershire sauce, and thyme and bring to a simmer. Once simmering, reduce heat to medium and cook until thickened, about 5-7 minutes.
FINISH POTATO TOPPING:
Drain in a colander and transfer potatoes back to pot. Add butter, cream cheese and milk. Mash until smooth, adding more milk (1 tablespoon at a time) until potatoes are thick but easily spreadable. Season potatoes with salt and pepper.
ASSEMBLE AND BAKE:
Pour meat filling into prepared baking dish and shake into an even layer. Evenly distribute peas and carrots over meat.
Using a rubber scraper, spread potatoes over peas and carrots. Use a for to make ridges over potatoes by dragging the fork lightly through the potatoes. Brush potatoes with beaten egg and bake until the meat filling is bubbly, about 15-20 minutes.
Turn on the broiled and broil for 2-5 minutes, or until the top of the potatoes are golden brown.
Cool on a wire rack for 5-10 minutes, and then serve!
Sometimes my grocery store doesn't have frozen peas and carrots. When this happens, I use a frozen vegetable medley instead (peas, carrots, string beans, and corn).