Atletico Madrid’s 2-1 win over Athletic Bilbao earlier in the day means Real now trail their city rivals and Barcelona by five points at the top of the table.
Real were outplayed in the first-half on Sunday, but reacted after the break and were left to rue a hat-trick of missed chances by troubled French striker Karim Benzema as defeat piles the pressure on under-fire coach Rafael Benitez.
Elsewhere, a late own goal salvaged a point for Valencia in Gary Neville’s first taste of La Liga action as Los Che battled back with 10 men to draw 1-1 at Eibar.
Real had won five consecutive games since being thrashed 4-0 at home by Barca last month, but were forced onto the back foot by a whirlwind start from Villarreal.
“I am not happy at all with the first half and I think the reaction in the second half is the route we have to follow,” said Benitez.
“Unfortunately, today it has cost us three points.”
Jonathan dos Santos had already smacked the inside of the post before Soldado turned home Cedric Bakambu’s pass against his old club on eight minutes.
Bakambu had two great chances to double Villarreal’s advantage before half-time, but the Congolese striker pulled his shot wide when clean through on Keylor Navas before firing over from inside the area.
Having been dominated in the first half, Madrid came out a different side after the break and had a series of chances to turn the game on its head.
Benzema had scored five times in his last two outings for Madrid despite his off-field problems which saw him indefinitely banned from playing for France in midweek, however his range was off as he volleyed inches wide from Gareth Bale’s through ball.
Another fine Bale cross was blasted over by Benzema moments later before Bale had a great chance himself, but on his weaker right foot didn’t have the power to beat Alphonse Areola in the Villarreal goal.
Benzema had one final chance to rescue a point, but his and Madrid’s night was summed up when he headed wide when unmarked inside the area 17 minutes from time.
Victory takes Villarreal back to within a point of fourth-placed Celta Vigo.
At the Vicente Calderon, Atletico were forced to come from behind as they conceded for just the seventh time in 15 La Liga games this season when Aymeric Laporte swept home Benat Etxebarria’s corner at the back post.
Atletico had barely threatened in the first half but levelled with the last action of the half as Saul Niguez headed in at the near post.
Jan Oblak made two great saves at the start of the second period from Eneko Boveda and Aritz Aduriz to keep Atletico in the game.
And they proved vital as Antoine Griezmann’s stunning strike from 25 yards with Atletico’s only serious effort of the second half delivered a vital three points.
“We always work to be better and it is clear that we continue on our course, looking to improve without looking at the other teams,” said Atletico boss Diego Simeone.
“It is not easy to concede first and come back. We are happy with our work, but we don’t understand any other way than through sheer effort.”
Valencia escaped from Eibar with a point despite another disappointing display after crashing out of the Champions League against Lyon in Neville’s first game in charge in midweek.
Sergi Enrich deservedly opened the scoring for Eibar with the last kick of the first half.
However, the turning point came midway through the second period when Valencia goalkeeper Jaume Domenech saved Saul Berjon’s penalty after Lucas Orban had been very harshly sent off for supposedly elbowing Dani Garcia.
And Valencia got the slice of luck they needed when David Junca turned the ball into his own net five minutes from time.
A point leaves Valencia seven points off the top four in eighth.
“The last 20 minutes is the minimum that Valencia should show every week,” said Neville.
“We wanted to win, a draw is not ideal, but it is positive given the circumstances.”