It's a very good sign to have your VCL code isolated from the other code.
n-Tier architecture does make sense, and IMHO a full RAD approach is good for prototyping, but has some severe drawbacks for creating maintainable applications, with additional features.
The standard way of using Delphi XE2 is to use only FireMonkey forms and UI. Therefore, cross-compilation will be made easy. This does perfectly make sense, in term of maintability: once your FireMonkey code and forms are set, you can deploy them on several platforms, just by a recompilation. And do not forget that Linux will possibly be a target in the close future (DXScene was Linux and Android ready). Using a form converter may help you have the code using FireMonkey instead of the VCL.
If you only need some simple forms for Mac OS X, and expect a more complex application for Windows (which could be an idea, depending on marketing targets), you can create a pure FireMonkey "light" application. But I do not recommend using a lot of conditional define. Create a diverse project, with a proper FireMonkey platform. Then share all your non-VCL units among the VCL project and the FireMonkey project. You do not need conditional define for this pattern.