1. You can use BSplineFunction
as follows:
pts = {{-1, 0}, {-1, 1}, {0, 0}, {1, 1}, {1, 0}};
ClearAll[explode, bsf]
explode[f_] := f[#] + #2 Cross @ Normalize[f'[#]] &;
bsf = BSplineFunction[pts, SplineClosed -> True];
Graphics[{Thick, BSplineCurve[pts, SplineClosed -> True], Blue,
Line[explode[bsf][#, .2] & /@ Subdivide[100]]}] // Framed

Graphics[{Thick, Line[bsf /@ Subdivide[100]], Blue,
Line[explode[bsf][#, .2] & /@ Subdivide[100]]}] // Framed

2. You can also use bsf
and explode
with ParametricPlot
:
ParametricPlot[{bsf@t, explode[bsf][t, .2], explode[bsf][t, -.1]}, {t, 0, 1},
PlotStyle -> {Black, Blue, Green}, BaseStyle -> Thick, Axes -> False,
ImageSize -> Large]

3. Alternatively, you can use SignedRegionDistance
+ ContourPlot
:
srd = Quiet @ SignedRegionDistance[Polygon[bsf /@ Subdivide[100]]];
ContourPlot[srd[{x, y}], {x, -3/2, 3/2}, {y, -.5, 1},
ContourShading -> None,
Contours -> {{.2, Blue}, {0., {Thick, Black}}},
Frame -> False, ImageSize -> Large, AspectRatio -> Automatic]

Use the options
ContourShading -> {PatternFilling["Grid", ImageScaled[1/10],
ImageScaled[{0, .35}]], None, None}
and
Epilog -> {Red, Disk[{0., .75}, .25], Black, Disk[{-.5, .8}, .1], Disk[{.5, .8}, .1]}
to get

Related Q/As:
pts = {{-1, 0}, {-1, 1}, {0, 0}, {1, 1}, {1, 0}}; Graphics[{Thick, BSplineCurve[pts, SplineClosed -> True], BSplineCurve[1.1*pts, SplineClosed -> True]}]
? $\endgroup$