Prepare the Onions: Peel the onions and slice them into uniform 1/4-inch thick rings. Gently separate the rings and set them aside.
Make the Batter: In a medium bowl, whisk together the flour, cornstarch, salt, pepper, paprika, and garlic powder (and cayenne, if using). In a separate small bowl, whisk together the cold milk and the egg until well combined.
Combine Wet and Dry: Pour the wet ingredients into the dry ingredients and whisk until just combined. A few lumps are okay; don't overmix. The batter should be thick enough to coat the onions but not overly dense.
Heat the Oil: Pour the vegetable oil into a deep fryer or a heavy-bottomed pot to a depth of at least 3 inches. Heat the oil over medium-high heat to 350°F (175°C). Use a thermometer to monitor the temperature; maintaining the correct temperature is crucial for crispy, non-greasy rings.
Coat the Onion Rings: Dip each onion ring into the batter, ensuring it's fully coated. Let any excess batter drip back into the bowl for a moment.
Fry in Batches: Carefully place a few battered onion rings into the hot oil, being careful not to overcrowd the pot. Fry for 2-3 minutes per side, or until golden brown and crispy. Use a slotted spoon or spider strainer to gently turn them as they cook.
Drain and Season: Once golden and cooked through, remove the onion rings from the oil using the slotted spoon or spider strainer. Place them on a wire rack set over a baking sheet to drain any excess oil. Immediately sprinkle with a little extra salt while they are still hot, if desired.
Repeat and Serve: Continue frying the remaining onion rings in batches, ensuring the oil temperature remains at 350°F (175°C). Serve immediately while hot and crispy.