Instead of casting rays in 360 degree fashion, cast rays to the corners of the tiles. See: http://ncase.me/sight-and-light/ for an example in range of the lightsource.
Sort the angles from the light source to the tile corners and do a 'sweep'. You can optimize the algorithm to look for the nearest tiles first and ignore angles for culled tiles:
A--B E--F
o |T1| |T2|
C--D G--H
Angles would be sorted: A, B, E, F, H, G ,D, C (draw lines from o to the corners). First tile T1 is checked, because it is closer. A is visible, B is not. C is visible and D is not. This results in tile T2: E, F, H, G angles being ignored because they're all between A and C.
If the lights are in fixed positions or rarely move, calculate the polygon only when the light is placed or moved. Store the polygon shape and use that to draw the light effect.
See: http://ncase.me/sight-and-light/ for an example of the light ray algorithm.