One option is to define your own matrix-multiplication function, such as:
ClearAll[mmult];
mmult[a_?MatrixQ, b_?MatrixQ, multF_: Times] :=
Outer[Inner[multF, ##, Plus] &, a, Transpose @ b, 1, 1]
With the default multiplication function, it would return the same result (although probably much less efficiently):
mmult[{{\[Lambda] E,B},{\[Lambda] A1,\[Lambda] E}},{{E,0},{-A1,E}}]
(* {{-A1 B+E^2 \[Lambda],B E},{0,E^2 \[Lambda]}} *)
But you can also supply your own function:
mmult[{{\[Lambda] E, B}, {\[Lambda] A1, \[Lambda] E}}, {{E, 0}, {-A1, E}}, mult]
(*
{
{mult[B, -A1] + mult[E \[Lambda], E], mult[B, E] + mult[E \[Lambda], 0]},
{mult[A1 \[Lambda], E] + mult[E \[Lambda], -A1], mult[A1 \[Lambda], 0] + mult[E \[Lambda], E]}
}
*)