I can't speak to the 2nd issue of the X and Y "home in place" and the home cycle not completing. Try opening the Mach4 log window (Diagnostics->Logger, and then click the "play" button to enable it) and then try the home sequence. See what it says.
As for the Z axis - the homing movement is supposed to leave the axis at (or very near) the home switch. So the action you describe is correct. If you want the axis moved somewhere else before the other axes start homing you will need to edit the homing script that is built into the Mach4 screen sets. This is from memory so I may not have all the details exactly correct. You can search the forums for info on editing the screen set and finding the "load scree"n" script that I mention below.
In the recent Mach4 builds (2914 and 3206) in the wx4 screen sets, the "Ref All Home" button runs a Lua script called RefAllHome(). That script is located in the "load screen" script in the screen set (or is it "screen load", I don't remember). RefAllHome() does something like this (in build 3206 at least):
Deref all axis
HomeAllAxis
You will have to change this to something like this:
DerefAllAxis()
HomeAxis( inst, Z_AXIS )
issue command to move Z axis to zero
HomeAxis( inst, X_AXIS )
HomeAxis( inst, Y_AXIS )
For the exact syntax and names of these functions, there is a help file names Mach4CoreAPI.chm in the Mach4Hobby\Docs directory. Sorry to be so non-exact, but I am not at a PC with Mach4 on it.
Bob