In case anyone is facing a similar problem, it was suggested that I tried the OCC kernel for generating the mesh, and it indeed made the code considerably simpler.
I am sharing here a code snippet in case it might be helpful to someone in the future
Thank you for the support.
from ngsolve import *
import netgen.gui
from netgen.occ import *
from numpy import random
d_box = 1
l_domain = 1
r_cyl = 0.3
el_clad = 0.2
el_core = 0.1
cube_back = Box(Pnt(-d_box,-d_box,-l_domain/2),Pnt(d_box,d_box,0)).bc('outer')
cube_front = Box(Pnt(-d_box,-d_box,0),Pnt(d_box,d_box,l_domain/2)).bc('outer')
cyl = Cylinder(Pnt(0,0,-l_domain/2),Z, r=r_cyl, h=l_domain)
clad_front = cube_front - cyl
clad_front.mat('clad').maxh = el_clad
clad_back = cube_back - cyl
clad_back.mat('clad').maxh = el_clad
core_front = cube_front * cyl
core_front.mat('core').maxh = el_core
core_back = cube_back * cyl
core_back.mat('core').maxh = el_core
clad_front.faces.Min(Z).name = 'clad_2d'
core_front.faces.Min(Z).name = 'core_2d'
domain_list = [clad_front,clad_back,core_front,core_back]
geo = OCCGeometry(domain_list)
mesh = Mesh(geo.GenerateMesh(maxh=el_core))
#checking surface domains
surflist = {"core_2d":1, "clad_2d":2, "outer"
}
surf = mesh.BoundaryCF(surflist)
gu = GridFunction(H1(mesh),name='surfs')
gu.Set(surf, definedon=~mesh.Boundaries(''))
Draw(gu)