Allora c'è un errore nel do while e una cosetta da sistemare:

il do while ripete il ciclo se la condizione è vera, mentre esce se è falsa. A questo punto bisogna sottolineare che nel c++ (e in tutti i linguaggi di programmazione) i valori diversi da 0 vengono interpretati come true e lo 0 come false.

Altra cosetta da sistemare è inserire un cin.ignore(1); dopo cin >> esci; questo perchè cin non esegue il flush dell stin come il getline e sull standard input rimane \n che viene dato in pasto al nuovo getline.

Altro problema la funzione elimina_carattere ritorna un intero, ma tu lo assegni a un char senza fare cast espliciti, cosa che non è ottimale ne per la leggibilità del codice che per la correttezza dello stesso

io correggerei così:

codice:
#include <iostream>
#include <stdlib.h>

using namespace std;
int elimina_carattere(char[],  const char);
const int DIM = 100;


int elimina_carattere(char S[], const char X) {
    int el=0, i=0;
    int cont=0;  
    while(S[i]!='\0') {
        if(S[i]==X) {
            int j = i;
            while(S[j]!='\0') {
                S[j] = S[j+1];
                j++;
            }
            cont ++; i--;
        } i++;
    } return cont;
  }              
    

int main() {
    int esci = 1;
    do{
        
    char X;
    char S[DIM];
    
     cout << "INSERISCI UNA STRINGA" << endl;
     cin.getline(S,DIM-1);
     cout << "INSERISCI UN CARATTERE" << endl;
      cin >> X;

     int ris;
     ris = elimina_carattere(S, X);
    if(!ris) { cout << "NESSUN CARATTERE ELIMINATO" << endl; }
    else { cout << ris << " CARATTERI ELIMINATI" << endl; 
    cout << "LA STRINGA RESTANTE E': " << S << endl; }



    cout << "\n UN ALTRO GIRO? (Y=1,N=0)" << endl;
    cin >> esci;
    cin.ignore(1);
    system("cls");
  } 
  while(esci);
  
     system("PAUSE");	
     return 0;
}