I write the following into a script module (i.e. a psm1 file) and do Import-Module for that file:
New-Variable -Name 'mytest' -Value 'Foo' -Scope 'Global'
Now I can access this variable in my PowerShell session. $mytest yields Foo, for example.
Alternatively, I write the following into a script module and do Import-Module for that file:
New-Variable -Name 'mytest' -Value 'Foo' -Scope 'Global' -Visibility Private
Now, the variable $mytest is not accessible in my PowerShell session anymore, fair enough.
But if I do . {$mytest}, I can get access on my "private" variable again - how comes? Just in case you would ask, & {$mytest} works the same, btw.
Note 1: Please be aware, that I don't ask about the (pseudo-)scope private, but about the visibility option private, which is a difference: The scope private blocks visibility "down the invocation hierarchy", whereas the visibility option private should block visibility "up the invocation hierarchy" (at least I have understood it that way).
Note 2: The global scope in the example above is only there, to be able to access the variable $mytest from the PowerShell session in the first attempt. Otherwise, even "free" public variables in a module ("free" meaning here, variables outside all scriptblocks) would not be accessible from the PowerShell session, except if you would use Export-ModuleMember -Variable 'mytest' (you would be forced to explicitly export everything else from the module, too, then). But this wouldn't change anything on the result.