Heat the oven to 400°F (200°C). Line two baking sheets with parchment. Plan to bake one tray at a time on the center rack.
Heat the butter, water, and vanilla in a medium saucepan until the butter has melted and the liquid boils. Take the pan off the heat and stir in all the flour. Return to medium heat and stir firmly until the dough gathers into a soft ball, pulls away from the pan, and leaves a thin film on the bottom.
Move the dough to a mixing bowl and let it cool for 5–10 minutes, until warm rather than steaming hot. Beat in the eggs one at a time with a sturdy spoon or mixer. Let each egg blend in fully before adding the next. The dough may look separated at first; keep mixing until it becomes smooth and thick.
Drop rounded tablespoonfuls of dough onto the prepared sheets, leaving about 2 inches between them. Aim for about 24 small mounds, around 12 per tray. Keep the portions similar so they bake evenly.
Bake each tray for about 25–30 minutes. Keep the oven door closed while the puffs rise. They should be well risen, golden brown, and dry on the outside. Continue baking if they are still pale or soft. Bake the second tray in the same way; two batches take about 50–60 minutes in total.
Once a tray is baked, carefully make a small slit in the side of each puff to let steam escape. Transfer the shells to a cooling rack and allow about 30 minutes to cool completely.
While the shells cool, put the cold heavy cream, dry instant pudding mix, and cold milk in a mixing bowl. Beat on low to combine, then increase to medium-high and whip until thick, fluffy, and able to hold its shape. Stop before the cream turns grainy. Cover and refrigerate until needed.
Cut the cooled shells horizontally into tops and bottoms. Spoon or pipe the vanilla filling into the bottom halves and replace the tops gently. Dust with powdered sugar just before serving. Keep filled puffs refrigerated until serving.