Goals either side of half-time from Moises and Jeremy Perbet set the Yellow Submarine on a course to claim their first win in three attempts before substitute Jhon Cordoba halved the deficit.
Espanyol, who had won their two previous games, missed several chances to force the draw from open play and their fate was sealed when visiting goalkeeper Asenjo kept Garcia's penalty out at the death.
The victory lifts Villarreal above Real Sociedad and into fifth place on goal difference while Espanyol remain 10th.
There was little to excite fans of either side in the early exchanges, and it was not until the 26th minute that David Lopez Silva had the game's first shot on target.
The Espanyol midfielder tested Asenjo's reflexes with a volley from the edge of the box and, eight minutes later, Bruno clipped tamely against Diego Colotto in the hosts' penalty area.
Two minutes later, Moises made the breakthrough.
The Rojales-born teenager scored only his second La Liga goal when turning Matias Nahuel's cross from the left beyond Francisco Casilla.
The Yellow Submarine rode the wave of confidence generated by Moises' goal over the break and doubled their lead five minutes after play resumed in Barcelona.
This time Perbet was Johnny-on-the-spot when the ball appeared in the six-yard box and the Frenchman dutifully converted his eighth goal of the season.
Giovani Dos Santos went close to making it 3-0 when drilling just wide before the hour mark, but Espanyol would instead claw their way back into the tie.
In the 78th minute Cordoba seized on Garcia's assist from the left channel and rifled the ball beyond the diving Asenjo.
Espanyol pressed on and should have equalised when Hector Moreno got to the loose ball after Asenjo fumbled a free-kick from Garcia, yet he stubbed wide.
The Catalans took control of the game as time ticked away and, with Villarreal retreating, Lopez Silva headed wide of the mark with Asenjo stranded.
There was just one second of regulation time remaining when Espanyol were handed the opportunity to snatch a point from the penalty spot.
After Gabriel Paulista handled the ball in the area, Garcia stepped up to take the spot-kick.
However, Asenjo guessed right, diving low to his right to deny Garcia while making sure all three points went to Villarreal.