Preheat oven to 350°F. Line an 8x8-inch baking dish with parchment paper, leaving overhang for easy removal. Lightly spray with nonstick cooking spray.
In a medium bowl, whisk flour, granulated sugar, and salt.
Add the softened butter and mix with a fork or your hands until the mixture forms a moist, crumbly dough that holds together when squeezed (similar to damp sand with no dry patches).
Press the dough firmly and evenly into the prepared pan. Use your hands or the bottom of a measuring cup to create a smooth, level surface.
Bake for 15 to 18 minutes, or until the edges are lightly golden. While the crust bakes, prepare the filling.
In a medium saucepan (not a heavy-bottom pan) over medium heat, whisk together the milk, heavy cream, sugar, cornstarch, and salt. Cook, whisking constantly, until thickened and gently bubbling, 4 to 6 minutes. Reduce heat to low.
In a separate bowl, whisk together the eggs and vanilla. Slowly add about ½ cup of the hot milk mixture to the eggs to gently warm them (prevents curdling).
Pour the egg mixture back into the saucepan. Continue cooking over low heat, stirring constantly, until thickened to a smooth, pudding-like consistency, about 2 to 3 minutes. Do not allow the mixture to boil.
Immediately pour the hot filling over the pre-baked crust and spread into an even layer. Set aside.
In a small bowl, whisk together the flour, brown sugar, and salt.
Pour in the melted butter and stir with a fork until moist clumps form. Use your fingers to gently squeeze portions of the mixture to create a mix of small crumbs and larger clusters.
Sprinkle the crumble evenly over the warm filling, lightly pressing a few larger pieces into the surface.
Bake for 30 to 35 minutes, or until the topping is deep golden and the center has a slight jiggle (it will fully set as it cools).
Let the bars cool completely in the pan on a wire rack, about 1 hour. Then refrigerate for at least 2 hours (or overnight) before lifting out with the parchment and cutting into bars.
