Heat a medium skillet over medium heat. Add the pecans and toast for 1-2 minutes, stirring often, until fragrant and lightly toasted.
Transfer them to a blender and add in 2 cups of the milk, the vanilla extract, and salt. Blend until smooth and set aside.
Add the water, cinnamon stick, and piloncillo into a medium pot or saucepan and bring to a simmer over medium-low heat. Bring to a simmer, stirring occasionally, until the piloncillo and stir until fully dissolved. Discard the cinnamon stick.
Strain the blended pecan mixture through a fine mesh strainer into the same pot, and discard any solids. Stir in 1 cup of the remaining milk. Bring to a gentle simmer and cook for 5 minutes, stirring continuously.
Make a cornstarch slurry by whisking together the cornstarch with the remaining 1 cup of milk until fully combined. Slowly pour it into the pot while whisking.
Return to a gentle simmer and whisk for 10-15 minutes, or until the mixture has thickened and coats the back of a spoon.
Serve immediately in mugs with a dusting of ground cinnamon and garnish with chopped pecans.
Notes
Piloncillo: You can substitute 1 cup of brown sugar instead of the piloncillo.
Milk: Using whole milk adds a creamy texture and flavor, but you can make this dairy-free by using almond or oat milk.
Cinnamon: I recommend using Ceylon cinnamon as that is what's used in Mexican cuisine, but you can use whichever cinnamon sticks you can find.