Если в main опустить вызов setlocale в любом из вариантов, то вызов mbstowcs возвращает -1 на первом кириллическом символе. Если же setlocale вызван, то все работает корректно.
wchar_t* convert_from_UCS2(char* mess, size_t len){
    iconv_t ids = iconv_open("utf-8", "UCS-2");
    if( ids ==(iconv_t) -1 )
        return 0;
    wchar_t* message = (wchar_t*) malloc(MESS_MAX_LEN*sizeof(wchar_t));
    
    char rs[MESS_MAX_LEN];
    size_t out = sizeof(rs);
    memset(rs, 0, out);
    char* rsp = rs;
 
    if( iconv(ids, &mess, &len, &rsp, &out ) == -1 ){
        free( message );
        iconv_close(ids);
        return 0;
    }
    iconv_close(ids);
    if ( mbstowcs(message, rs, MESS_MAX_LEN) == -1 ){
        free( message );
        return 0;
    }
    return message;    
}
int main(int argc, char** argv) {
    if (setlocale(LC_ALL, "") == 0) return -1;
    //if (setlocale(LC_ALL, "ru_RU.UTF-8") == 0) return -1;
    char* syms="\x61\xf1\x98\x5c\x36\x9f\xd1\0";
    char* syms_ucs="\x55\x00\x6e\x00\x69\x00\x63\x00\x6f\x00\x64\x00\x65\x00\x20\x00\x20\x00\x4d\x04\x42\x04\x3e\x04";
    //char* syms_ucs="\x1f\x04";
    wchar_t* result = convert_from_GSM(syms);
    
    assert(result != 0);
    wprintf(L"%ls\n", result);
    free (result);
    result = convert_from_UCS2(syms_ucs, 24);
    assert(result != 0);
    wprintf(L"%ls\n", result);
    free (result);   
    return (EXIT_SUCCESS);
}




