If you need it really fast then use `Compile`:

    n = 1000000;
    a = RandomReal[{-1, 1}, {n, 2, 2}];
    b = RandomReal[{-1, 1}, {n, 2, 2}];
    
    cf = Compile[{{a, _Real, 2}, {b, _Real, 2}},
       b.a.b,
       RuntimeAttributes -> Listable,
       Parallelization -> True
       ];
    
    MapThread[Dot, {b, a, b}]; // AbsoluteTiming // First
    cf[a, b]; // AbsoluteTiming // First

> 1.46343
> 
> 0.075722