There is a direction vector available for each runway light. This is stored inside the airport .btg file along with the location and type for each light.
The original implementation used a cube map aligned with the direction vector, along with a "cleverly" designed texture to produce the desired intensity in the desired direction, along with smooth fading as you moved away from the optimal view direction. The center of the cube map texture was the brightest (viewed straight on from the ideal approach path) and the edges were dimmest (viewed from a perpendicular direction.)
The end result was that runways were actually pretty dim when viewed from the side, but as you flew around to the ideal approach path, they smoothly became brighter and brighter.
For taxi edge lights we gave a direction vector that is straight up, and then designed our cube map so the center was darkest (i.e. when viewed from above) and the edges were brightest (viewed from ground level.) So as you overflew an airport, you could hardly see the taxi lights, but from the ground they were very visible.
So my main point is that the light direction is encoded in the .btg file for each light, but off the top of my head, I can't say exactly how far up the call chain that information propagates ... much (all?) of that code has changed substantially since I originally wrote it, but the direction information is there to be used.