Наконец понял в чем моя ошибка, вот рабочий код:
void getItemText(HWND wnd, char *text, int item, int subItem)
{
DWORD dwProcessId;
GetWindowThreadProcessId(wnd, &dwProcessId);
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS/*PROCESS_VM_OPERATION | PROCESS_VM_READ | PROCESS_VM_WRITE*/, FALSE, dwProcessId);
LPSTR lpsz = (LPSTR)VirtualAllocEx(hProcess, NULL, 4096, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
LVITEM lvis = { 0 };
lvis.iSubItem = subItem;
lvis.cchTextMax = 1024;
lvis.pszText = lpsz;
LVITEM *lvi = (LVITEM*)VirtualAllocEx(hProcess, NULL, sizeof(LVITEM), MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
WriteProcessMemory(hProcess, lvi, &lvis, sizeof(LVITEM), NULL);
::SendMessage(wnd, LVM_GETITEMTEXT, (WPARAM)item, (LPARAM)lvi);
BOOL r = ReadProcessMemory(hProcess, lpsz, text, 1024, NULL);
VirtualFreeEx(hProcess, lpsz, 0, MEM_RELEASE);
}