For this, you could use the answer by J.M. to the question "Extruding along a path". The question here isn't a duplicate because it makes use of features in J.M.'s excellent answer that go beyond what the linked question actually asked for. In particular, that answer can deal with self-intersecting cross sectional curves, which is what you need for this question:
So what you have to do is: first copy the definitions in J.M.'s answer and then define your custom cross section:
cs = First@ Cases[ParametricPlot[ BSplineFunction[{{0., 0.}, {0.25, 0.25}, {0.25, 0.}, {0., 0.25}}, SplineClosed -> True][u] // Evaluate, {u, 0, 1}, MaxRecursion -> 1], Line[l_] :> l, ∞]; Graphics3D[{EdgeForm[], TubePolygons[path, cs]}, Boxed -> False]

For your arch example, it looks like this:
P[a_] := {-a, a, 1/2 a (8 - a)}; path = First@ Cases[ParametricPlot3D[P[a], {a, 0, 8}, MaxRecursion -> 1], Line[l_] :> l, ∞]; Graphics3D[{EdgeForm[], TubePolygons[path, 5 cs]}, Boxed -> False]

Edit: discrete shapes
Here is a discrete version where the shapes are inserted at positions given in a table. For the math behind the rotation transformation, have a look at "Finding unit tangent, normal, and binormal vectors for a given r(t)":
figureEight = ParametricPlot[ BSplineFunction[{-{0.25, 0.25}, {0.25, 0.25}, {0.25, -.25}, {-.25, 0.25}}, SplineClosed -> True][u] // Evaluate, {u, 0, 1}, MaxRecursion -> 1]

cs = First @ Cases[figureEight, Line[l_] :> l, ∞]; Clear[t]; r[t_] := P[t] uT[t_] = Simplify[r'[t]/Norm[r'[t]], t ∈ Reals]; vN[t_] = Simplify[uT'[t]/Norm[uT'[t]], t ∈ Reals]; vB[t_] = Simplify[Cross[uT[t], vN[t]], t ∈ Reals]; Show[ ParametricPlot3D[ {P[t]}, {t, 0, 8}, PlotStyle -> {Blue, Thick}], Table[ Graphics3D[{ Translate[ GeometricTransformation[Tube@Line[Map[Append[#, 0] &, 10 cs]], Transpose[{vN[s], vB[s], uT[s]}]], P[s]]}], {s, 0, 8}], PlotRange -> 10 {{-1.1, .2}, {-.2, 1.1}, {-.2, 1.1}}]

The matrix in GeometricTransformation is made up of the three unit vectors tangent, normal, and bi-normal to the arc curve. The figure-eight shape is centered at the origin in a 2D coordinate system, so we have to first use Append to add a z-coordinate 0 to its points, and then align the orthogonal Cartesian axes with the normal and bi-normal vectors at a given point along the curve. Finally, the whole shape is translated to the location P[s] where s is the curve parameter.