In a game of few opportunities, Mirallas put the ball wide from the spot following Joleon Lescott’s handball, having taken over the duty from usual taker Leighton Baines. The Belgian was then substituted minutes later at half-time.
The result leaves Everton without a win eight games in all competitions, sitting in 12th place in the Premier League, a point above West Brom.
Tony Pulis set out to contain the hosts throughout the first half, and succeeded in keeping opportunities to a minimum.
Mirallas tested the goalkeeper on two occasions, while Romelu Lukaku saw an effort blocked from just inside the area.
At the other end, West Brom rarely caused goalkeeper Joel Robles any problems throughout the first period.
But the hosts were awarded a penalty after former Everton man Lescott handled in the area under no pressure from a blue shirt, giving Michael Oliver no choice but to point to the spot.
But despite missing just one of his 16 penalties in the Premier League, Baines was brushed aside in favour of Mirallas, who struck the ball wide via the left-hand post. Mirallas was then brought off at half-time by manager Roberto Martinez for Bryan Oviedo.
Everton were again reduced to half-chances and blocked efforts after the break, and a goalmouth melee from a Baines corner was the closest either side came to a goal before the closing stages.
Lukaku had Everton’s best chance of the first half, lashing the ball wide after being found 12 yards out in space by Steven Naismith.
West Brom’s first chance fell to Stephane Sessegnon following good work by Andre Wisdom, but the Benin international’s effort flew wide of Robles’ goal.
The Baggies held on despite a flurry of late Everton corners to move above Aston Villa into 14th place in the Premier League.
Everton: Robles (6), Coleman (6), Stones (6), Jagielka (6), Baines (6), Besic (7), Barry (6), Mirallas (5), Barkley (5), Naismith (6), Lukaku (6)
Subs: Oviedo (6), Kone (6)
West Brom: Foster (7), Wisdom (6), McAuley (7), Lescott (7), Baird (7), Morrison (7), Yacob (8), Gardner (6), Brunt (7), Berahino (6), Anichebe (7).
Subs: Ideye (6), Dorrans (6), Sessegnon (6)
Man of the match: Claudio Yacob