Roman Bezjak scored both goals for the home side, whose progress into the last 32 was already secure, while PSV's misery was compounded by the dismissal of Jeffrey Bruma.
The Dutch now go into their final group match against Chornomorets next month knowing a win or a draw will secure progress while a defeat will see them eliminated.
The game got off to a sluggish start and it was not until PSV striker Memphis Depay blazed over the bar in the 12th minute that either side had a sniff at goal.
Virgil Misidjan then flashed a free-kick wide as Ludogorets enjoyed the better of possession with Hristo Zlatinski also missing the target from a set-piece.
Neither team was really managing to impose themselves on the game and Adam Maher saw a speculative long-range shot go wide of Vladislav Stoyanov's post.
PSV did eventually get their foot on the ball and dominate but it was then that they fell behind against the run of play.
Cosmin Moti found Bezjak and the Slovenian turned Karim Rekik and saw his shot take a deflection off Santiago Arias and leave Stoyanov with no chance.
Mihail Aleksandrov and Luciano Narsingh both had chances as the half wound down but the Bulgarians went in 1-0 up at the break.
PSV began the second half on the front foot but their job was made more difficult in the 55th minute when Bruma fouled Bezjak and the defender was dismissed for a second yellow card.
Ludogorets were struggling to make their numerical advantage count with a Marcelinho shot wide the best they could muster before Bezjak netted his second after 79 minutes.
Junior Caicara cut in from the right and found the striker who lifted the ball over Jeroen Zoet and into the net to seal the win.