If performance isn't a concern (heh), the way that I've solved this in the past is to draw the text five times. Basically, given a BorderColor and a InnerColor, if you want to draw at X, Y, Z the pseudocode is:
Draw Font with BorderColor at X-1, Y, Z-1
Draw Font with BorderColor at X+1, Y, Z-1
Draw Font with BorderColor at X, Y-1, Z-1
Draw Font with BorderColor at X, Y+1, Z-1
Draw Font with InnerColor at X, Y, Z
That obviously increases the load of drawing the text 5X, but sometimes in menus or for a small amount of text that is not really a worry. We do that in our Unity 3D game Tidalis, for example. It works with 3DText or render text, either way.
One caveat is that sometimes with certain fonts this may not look very good because of the borders being offset poorly. In those cases, you can do an (even more expensive) 9-stage draw process, as follows:
Draw Font with BorderColor at X-1, Y, Z-1
Draw Font with BorderColor at X+1, Y, Z-1
Draw Font with BorderColor at X, Y-1, Z-1
Draw Font with BorderColor at X, Y+1, Z-1
Draw Font with BorderColor at X-1, Y-1, Z-1
Draw Font with BorderColor at X+1, Y+1, Z-1
Draw Font with BorderColor at X+1, Y-1, Z-1
Draw Font with BorderColor at X-1, Y+1, Z-1
Draw Font with InnerColor at X, Y, Z
Talk about inefficient, but it looks really awesome in most cases. With a thick font, you can even do extra large borders (more than 1px) by simply using a variable in place of all those 1 consts for X and Y.
You can of course combine this with something like a RenderTexture, and then save the result for later use as a single texture, when performance is a concern (as it usually is). That way, if you're spending either 5x or 9x the normal render time for a single frame, that's no concern for any game -- then after that it's got a simple prerendered texture of the text, which would be more efficient than using the 3D text to draw the same string, anyway, to my knowledge.
So, despite the poor performance of this at first glance, there are tricky ways you can go about making it perform well. Granted, I'd love to have something simpler and without the need for these sorts of secondary steps, but this is the best I've been able to find to meet my own similar needs.