The best approach would probably bmap_blit... Your problem is the high amount of draw calls, as each quad is rendered seperately and the parameters and stuff are probably all seperately updated. And while the bmap_blit itself won´t be extremely fast, it shouldn´t cause any problems as long as don´t change all tiles each frame. The resulting bitmap can than be rendered in just one draw call...
Another alternative not directly possible with gamestudio would be geometry shaders. The possible solution which is similar would be to prepare a mesh with the maximum number of quads you need and do some vertex manipulation on it to set positions and texcoords in an atlas texture. The last thing would probably be the fastest solution with gamestudio, but bmap_blit should be a bit easier to realize and perform good enough.