NB: For my purpose, after a deeper read of the documentation, rather than set the entire shader to -fno-fast-math I've also found using the namespace metal::precise:: seems to work as expected. But my original question about the compiler setting is still valid I think. I don't consider myself an expert in MSL so I'm interested in knowing what is considered best practice etc.
By default Xcode sets Enable Fast Math flags to YES which should correspond to passing the -ffast-math flag to the Metal compiler.
If you change the option to NO this will correspond to the -fno-fast-math option being passed to the compiler. You can check what options are being passed to the compiler by inspecting the build logs in Xcode. You shouldn't need to add -fno-fast-math to the Other Metal Compiler Flags for this purpose.
The namespace metal::precise provides developers with a mechanism to use the more precise version of Metal standard library functions in a more fine grained way. Fast math allows for compiler optimizations like reassociation over common operations like addition/subtraction/etc. which are not valid under precise math rules. Mpre information about this can be found in the Metal Shading Language Specification under the Section Math Intrinsics Compiler Options. For best performance, in general it is better to try and keep as much of the shader using Fast Math.