The most probable cause is that the home directory defined in the user database is different to what being set as $HOME
by your profile and login scripts.
As for,
> echo $HOME
/Users/xxmplus
> echo ~
/Users/xxmplus
The above is strictly according to spec, a standalone ~
is simply defined to be $HOME in POSIX, so this proves little.
But this is different:
> echo ~xxmplus
/home/xxmplus
The spec says the following,
... the tilde-prefix shall be replaced by a pathname of the initial working directory associated with the login name obtained using the getpwnam() ... If the system does not recognize the login name, the results are undefined
http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_01
So another quite unlikely option is that you’ve run into the undefined behaviour part of the spec – this can be the case when the login name (xxmplus) is not recognised on the box, specifically, it cannot be obtained with getpwnam(), however the simpler explanation is that it is there and you have to simply change the home directory in the user database.