One of the easiest ways to have LabView control a CVI project is to make the CVI project a DLL. In LabView, you can then use the Call Library Function to call any function that you have exported from CVI.
CVI ships with several DLL examples. Look at those to understand the structure.
Instead of a main() function, you'll have a DllMain(). But you don't export that function or call it directly: it gets called automatically when you call another function. Typically, just leave the stuff in DllMain that CVI adds to it: don't move your main() stuff there. I will typically put the main() stuff (LoadPanelEx, DisplayPanel, etc.) in an init function then export the init function.
For projects that I will optionally want to use the user interface, I pass a parameter to the init function and set a global g_Use_CVI_UI. I check g_Use_CVI_UI before loading and displaying panels or interacting with controls. To run the program stand-alone, I create a simple exe project (in the same CVI workspace) which just calls the init function from the DLL with the use_CVI_UI parameter set true. Then the DLL takes over.
If you're using any of the user interface panels, etc., you built in CVI, use LoadPanelEx instead of LoadPanel.
Rather than trying to call a CVI callback from LabView, I would create a function in CVI that does the real work for the callback, then call that function from the callback function and export that function from the DLL.
Look at the DLL sample projects that ship with CVI.
Look
here and
here for some additional info on DLL and exported functions.