Premetto che non sono molto esperto;
secondo me il problema è semplice: con
if( a[i] == a[j]) {
flag=1;
}
confronti ognin volta l stesso valore con se stesso (se ad esempio i=2, quando nel ciclo j diventerà 2 avrai if( a[2] == a[2]) {flag=1;}, il risultato sarà per forza flag=1), flag per questo è sempre 1 il valore non viene mai passato a b[].
Inoltre devi specificare all'inizio del ciclo iniziale che flag=0, oppure appena diventerà 1 lo resterà per tutti i cicli successivi e qualunque sia il risultato del paragone flag sarà sempre 1.

Ecco come scriverei io il codice:

codice:
#include <cstdlib>
#include <stdio.h>

int main() { 

int a[6]= { 1,3,2,3,1,5 };
int b[6];
int i,j,k,x;
int flag=0;

for(k=0; k<6; k++) {   // azzero il vettore B
   b[k]=0;
   }

for(i=1; i<6; i++) {   //Confronto ogni elemento con il resto dell'array
flag=0;//ogni volta devi riportare flag a 0
    for(j=0; j<6; j++) {
if (i!=j){
       if( a[i] == a[j]) {
          flag=1;
          }
   }
   }
if(flag == 0) {
    b[i]=a[i];
    }
}
 printf("%d " , b[0]);//eviti la virgola finale
 for(x=1; x<6; x++){   //stampo a video l'array ottenuto
 printf(",%d " , b[x]);
 }
 return 0;
}
Spero di esserti stato d'aiuto!
Fammi sapere!