Make the dough: In a stand mixer bowl, whisk together 20 ounces all-purpose flour, 0.25 cups granulated sugar, and 2 tsp kosher salt. Stir in 2.25 tsp instant yeast. Add 1.25 cups whole milk and 3 tbsp softened unsalted butter; mix on low until shaggy, 2–3 minutes, then knead on medium-low until smooth and slightly tacky, 3–4 minutes.
Chill the dough: Pat the dough into a 1-inch-thick rectangle, wrap tightly, and refrigerate 8–12 hours (overnight) to relax gluten and develop flavor.
Prepare the butter block: On a sheet of parchment, pound and shape 10 ounces cold unsalted butter into a 6×8-inch slab about 0.5 inch thick; chill until firm but pliable, 20–30 minutes (it should bend without cracking).
Enclose butter and make the first turn: Lightly dust the work surface with the 0.25 cups flour for dusting (use only this flour as needed for all rolling). Roll the cold dough to a 10×16-inch rectangle, 0.5 inch thick, 2–3 minutes. Place the butter centered; fold the dough like a letter to encase, pinching seams. Roll to an 8×24-inch strip, 0.25–0.33 inch thick, 2–3 minutes, then fold in thirds (first turn). Wrap and chill 30 minutes.
Second turn: Roll the dough to an 8×24-inch strip, 0.25–0.33 inch thick, 2–3 minutes. Fold in thirds, wrap, and chill 30 minutes.
Third turn: Roll again to 8×24 inches, 0.25–0.33 inch thick, 2–3 minutes. Fold in thirds, wrap, and chill 1 hour (or up to 12 hours) until relaxed and cool.
Shape: Line 2 baking sheets with parchment. Roll the dough to a 10×20-inch rectangle about 0.25 inch thick, 3–5 minutes. Trim clean edges. Cut the rectangle into long triangles with 4-inch bases; cut a 0.5-inch notch at each base. Stretch each triangle gently, then roll from base to tip to form a crescent, 10–15 minutes total. Place on sheets with the tip underneath, spacing 3 inches apart.
Proof: Cover loosely with plastic or a large bag and proof at 75–80°F until puffy, jiggly, and about 50% larger, 1.5–2 hours. During the last 30 minutes of proofing, preheat the oven to 400°F.
Egg wash: Beat 1 large egg with 1 tbsp whole milk until smooth, 20–30 seconds. Gently brush the croissants with a thin, even coat just before baking.
Bake: Bake at 400°F until deeply golden brown and crisp, 18–22 minutes, rotating the pans halfway. Cool on racks until just warm, 10–15 minutes, before serving.