Separating the even and odd numbers in an array in C
Efficiency
Your code is already more efficient than you think. It has time complexity \$\mathcal{O}(n)\$, and thanks to tail recursion, it also has space complexity \$\mathcal{O}(1)\$.
Avoid forward declarations
I recommend that you avoid the need to forward-declare arrange() and swap() by reversing the order in which the functions appear in your source file. This avoids repeating yourself.
Don't return a void
Unfortunately, the C standard explicitly forbids calling return with an expression in a function returning void, even if the result of that expression itself is also void. While both GCC and Clang allow it, they will produce a warning when the -pedantic option is used. Just separate the call to arrange() from calling the return statement.
Simplify the code
Without making any changes to the algorithm, you can simplify the code. For example, the while-statement is redundant, since its condition will always be true in the first iteration, and you always call return inside the body, so it won't ever repeat. Furthermore, you can avoid having to declare the variables istart and iend. Here is how it could look:
void arrange(int arr[], int n) {
    if (n &lt;= 1)
       return;

    if (arr[0] % 2 == 0) {
        arrange(arr + 1, n - 1);
    } else if (arr[n - 1] % 2 != 0) {
        arrange(arr, n - 1);
    } else {
        swap(&amp;arr[0], &amp;arr[n - 1]);
        arrange(arr + 1, n - 2);
    }
}