Yes, this code cannot work correctly as posted. Several secret incantations are required to get the context menu at the correct location and for mouse capture to be setup correctly so that clicking outside of it works properly. These incantations are required because it is Windows Explorer that manages the notification icon, not your program.
You need to leave it up to the NotifyIcon class to get this right. A significant hang-up however is that it doesn't expose the method that displays the context menu, it is a private method. Only thing you can do about that is to use Reflection to invoke the method. Like this (using the default names):
Imports System.Reflection
...
Private Sub NotifyIcon1_MouseDown(sender As Object, e As MouseEventArgs) Handles NotifyIcon1.MouseDown
NotifyIcon1.ContextMenuStrip = ContextMenuStrip1
Dim mi = GetType(NotifyIcon).GetMethod("ShowContextMenu", BindingFlags.NonPublic Or BindingFlags.Instance)
mi.Invoke(NotifyIcon1, Nothing)
End Sub