Aunque entiendo que sea para aprendizaje, aconsejo utilizar en vez de "U" para la unión utilizar "|" (barra vertical); por la razón, de que en todos los lenguajes de programación utilizan "|" para evaluar las expresiones regulares. Más información en: http://jarroba.com/busqueda-de-patrones-expresiones-regulares/
De este modo pasaríamos de:
(cb)*ca(ab)* U b(ba)*b U (ab)*a(ba)*b
a
(cb)*ca(ab)* | b(ba)*b | (ab)*a(ba)*b
Pero voy a respetar la U de unión para realizar la simplificación.
Hay que ver es que se puede extraer que sea repetido (la gracia está que conozcas algunas reglas que son muy lógicas, de este modo es bastante sencillo verlo), lo más sencillo es empezar observando el final de los conjuntos (llamo conjuntos a los que están separados por la "U"). Como en el siguiente ejemplo sencillo:
aB U cB = (a U c)B
De este modo podemos simplificar en un primer paso extraemos la "b" final de los dos últimos conjuntos:
(cb)*ca(ab)* U (b(ba)* U (ab)*a(ba)*)b
Y luego en un segundo paso con la misma norma, extraemos el "(ba)*" también de los dos últimos conjuntos:
(cb)*ca(ab)* U ( (b U (ab)*a) (ba)* )b
Viendo que esta regla ya no se aplica en más casos. Podemos pasar a otra regla como la de eliminar paréntesis innecesario. Por ejemplo
a(B) = aB
De este modo podemos eliminar
(cb)*ca(ab)* U (b U (ab)*a) (ba)* b
Y ya lo tendrías. Como puedes ver el primer conjunto no hemos encontrado la manera de reducirlo con los otros.
Y un ayuda para facilitarte el estudio de la simplificación de expresiones regulares (úsala como ayuda para las simplificaciones más complicadas, para entenderlo todo muy bien, como si fuera un profesor que te ayuda con la solución, no para hacer trampas; no estoy delante tuya, aunque confío en que sepas que es lo mejor para tu experiencia :) ). En la siguiente web te desgrana por pasos cada simplificación, explicándola (en este caso para la unión "U" utiliza "+"): http://ivanzuzak.info/noam/webapps/regex_simplifier/