One quick question: are you trying to avoid needing to install the LabVIEW runtime on the target machines? If so, I don't believe packaging it in a DLL will accomplish that. (Correct me if I'm wrong, but I think LabVIEW created DLLs still have dependencies on the LabVIEW runtime.)
In general though, I agree with your suspicion as to why it isn't working. One test you could perform to clarify the situation would be to added another VISA write and DLL read in line after the second form in your attached JPG. If the resource is hosed up after your DLL read also, I agree, it would point to the DLL calls causing the resource to hang. Perhaps the process of translating the VISA resource name from a string to the actual resource object causes the VISA session to be tied to the scope of the DLL function call (hence automatically releasing when the call is completed)? If so, maybe passing the actual VISA resource name would help. The VISA resource is really nothing more than a pointer to an object (a LVRefNum). From the perspective of language independence, I think that probably amounts to a 32-bit integer.
Also, perhaps you could just avoid building this level of granularity into the DLLs? The idea of creating a DLL is to abstract away some complex task. I'm not sure what benefit you get of creating DLLs out of such basic functions.
Anyway, good luck.