Do I always need to call wp_get_current_user() before accessing $current_user?

Yes, as a best practice, you should call wp_current_user() because you can’t assume that $current_user is set (or if it is set correctly with the user you’re after).

Of course, there’s a third option that’s only just sprung to mind…
test whether $current_user is already set/defined and if it isn’t,
call wp_get_current_user().

Actually, that’s kind of what happens already. wp_get_current_user() is just a wrapper for the private method _wp_get_current_user(), so you can look at that function to see what it does. The first thing it does is check if $current_user exists and is populated, and if so, it returns $current_user.

To address your question of efficiency/inefficiency, since the method is already checking to see if $current_user is loaded, it would actually be more inefficient if you were doing it, then running wp_get_current_user() since that would be an unnecessary step.