It's not one-way binding, but one time binding that you are talking about. One time bindings only use the first value, and then never update.
However, <div ng-if="::!vm.user.loggedIn"></div> is completely valid and should work correctly. See this plunker for example: http://plnkr.co/edit/o1va21WuuAykFRTBOGRT?p=preview
The internal code angular uses doesn't do anything special to the expression, aside from stripping off the two colons at the start and changing a oneTime boolean. My guess is that you have some other logic (probably asynchronous) that determines vm.user.loggedIn and the 1 time binding uses the initial value, then does not update, or there is some other error preventing the code from working.
ng-if="::!vm.user.loggedIn"works for me: jsfiddle.net/858tk3nn