Sbagli un sacco di roba, perciò ti presenterò due esempi funzionanti che potrai studiarti.
codice:
#include <stdio.h>
#include <stdlib.h>

int *_reverse(int *a, int sz, int *na, int i) {
    if(i == sz) return na;
    na[sz-i-1] = a[i];
    return _reverse(a, sz, na, i+1);
}

int *reverse(int *a, int size) {
    int *na = (int *)malloc(sizeof(int)*size);
    return _reverse(a, size, na, 0);
}

void _reverse1(int *a, int *na, int sz) {
    if(sz == 0) return;
    *na=*a;
    return _reverse1(a-1, na+1, sz-1);
}

int *reverse1(int *a, int size) {
    int *na = (int *)malloc(sizeof(int)*size);
    _reverse1(a+size-1, na, size);
    return na;
}

int main(void) {
    int a[4] = {1,2,3,4};
    int *b = reverse(a, 4);
    int *c = reverse1(b, 4);
    int i;
    for(i = 0; i < 4; ++i)
        printf("%d\t%d\n", b[i], c[i]);
    free(b);
    free(c);
    return 0;
}
Da notare comunque che C e ricorsione non vanno proprio a braccetto e neanche ricorsione e array.