Butter a 2-quart shallow casserole dish. In a large pot of salted boiling water, cook the macaroni until al dente, about 5 minutes. Drain; transfer the pasta to the prepared casserole dish along with 1/4 cup of the cold milk. (This will cool the pasta and prevent it from becoming gummy.)
Meanwhile, mix the cheeses together in a small bowl. Beat the eggs with 1/4 cup of the milk in a medium bowl. Add the scallions, bread and half of the cheese to the egg mixture; set aside.
Cook the bacon in a large skillet over medium heat until crisp; transfer to paper towels to drain. Discard all but 2 tablespoons drippings from the pan. Add the onion and garlic; cook, stirring, until just brown, about 4 minutes. Stir in the flour, cayenne pepper and 1 teaspoon salt; cook for 2 minutes. Slowly add the remaining 2 cups milk to the skillet. Bring to a boil, whisking until thick. Remove the sauce from the heat and whisk to cool slightly. Whisk in the remaining cheese. Add the sauce to the macaroni; stir to combine.
Crumble up the bacon and add it to the bread mixture. Spread evenly over the pasta. Place the casserole dish on a baking sheet and bake until golden brown, about 35 to 40 minutes. Remove from the oven; let sit 5 minutes before serving.