Sprint Cup regulars Bowyer and Kyle Busch were the only drivers to lead the Atlanta 200 until the last round of stops brought the leaders onto pit road for fuel and tires.
The 53-year-old Hornaday stayed out, knowing he had enough fuel to make it and hoping his worn-out tires would hold out. They did, even though Bowyer was knocking off nearly 2 seconds a lap.
Hornaday won by 1.596 seconds over Bowyer, while Busch settled for third.
"I'll take 'em any way I can get 'em," the winner said. "That's cool."
Bowyer led 97 of 130 laps on the 1.54-mile trioval, looking as though his second truck win of the year was a mere formality. Then he wound up trying to chase down Hornaday, coming up one lap short.
"Of course I'm disappointed. What a great run. You can't ask for any more from your truck or your team," Bowyer said. "The truck was fast all day long. We just got out-snookered. You can't outrun strategy."
Ricky Carmichael claimed the pole for the first time in 60 career starts, but he couldn't hold it for even one lap. Bowyer surged to the lead and stayed there most of the night.
Hornaday banged into the rear of Josh Richards' truck early on and didn't seem much of a factor. Busch was the only one who could run with Bowyer, going to the front a couple of times for a total of 14 laps.
"We had the second-best truck," Busch said. "For a few moments, we could get in front of Clint. But we didn't have it on the long runs. We'd always get loose. We could never get it the way we needed it."
Austin Dillon was the only other driver to lead, moving to the front for two laps after Bowyer and Busch made their final pit stops. When Dillon made his stop, Hornaday took the lead. His crew had been hoping it would work out that way ever since that early collision.
Hornaday nursed it to the end, even with lapped trucks flying by and Bowyer charging hard.
"See that trophy," Hornaday said, pointing to his prize. "We stole it tonight. We'll take it any way we can get it."