In a large mixing bowl, whisk together the flour, sugar, instant yeast, and salt. Add the cold milk, cold water, and softened butter. Mix until a rough dough forms, then knead for about 5 to 8 minutes until smooth and elastic. The dough should feel firm but pliable. Shape it into a rectangle, wrap it tightly, and refrigerate for at least 1 hour.
Place the cold butter between two sheets of parchment paper. Use a rolling pin to pound and roll it into a square approximately 6 × 6 inches. Keep the butter cool but pliable so it can bend without breaking. Refrigerate it briefly if it becomes soft or greasy.
Place the chilled dough on a lightly floured surface and roll it into a rectangle approximately 10 × 10 inches. Position the butter block diagonally in the center of the dough. Fold the corners of the dough over the butter so it is completely enclosed, pressing the seams together to seal.
Roll the dough into a long rectangle approximately 8 × 24 inches, working gently so the butter remains evenly distributed. Fold the dough into thirds, like a letter. This completes the first fold. Wrap the dough and refrigerate for 30 to 45 minutes.
Repeat the rolling and folding process two more times, chilling the dough between folds. If the dough resists rolling or the butter begins to soften, return it to the refrigerator before continuing. These folds create the thin layers that give croissants their flaky texture.
After completing the folds, wrap the dough tightly and refrigerate it for at least 2 hours, preferably overnight. The dough should be cold and firm before shaping. This resting period also allows the gluten to relax, making the final rolling easier.
Place the chilled dough on a lightly floured surface and roll it into a rectangle approximately 10 × 20 inches and about 1/8 inch thick. Trim the edges with a sharp knife to create neat sides. Cut the dough into 12 long triangles, each with a base of approximately 3 to 4 inches.
Make a small cut in the center of each triangle's wide base. Gently stretch the triangle lengthwise, then roll it from the base toward the tip without pressing too tightly. Curve the ends slightly inward to form the traditional crescent shape. Place each croissant on a parchment-lined baking sheet with the pointed tip tucked underneath.
Cover the shaped croissants loosely and let them rise in a warm, draft-free place for approximately 2 to 3 hours, depending on the room temperature. They should look noticeably larger, feel light, and wobble gently when the baking sheet is moved. Keep the environment moderate rather than hot, as excessive warmth can cause the butter to melt out of the dough.
Whisk the egg and milk together in a small bowl. Gently brush a thin layer over the croissants, taking care not to let the egg wash pool around the edges or run down the cut sides, as this can interfere with the pastry layers.
Preheat the oven to 400°F (200°C). Bake the croissants for 18 to 22 minutes, or until deeply golden brown, crisp on the outside, and fully baked through. If baking on two trays, rotate their positions halfway through if your oven heats unevenly.
Transfer the croissants to a wire rack and allow them to cool for at least 10 to 15 minutes. Serve warm or at room temperature. The exterior should be crisp and flaky, with a tender, airy interior.