I've done the hard bit and have managed to define a method that does what I want. I will provide it here for reference. I would still appreciate if someone who is more conversant than me in muPad could take a look at this code and suggest some efficiencies.
Bx::_mult:=
proc(a,b)
local type1,type2,berns,c,n,k,ni,ki;
begin
lists:=split(args(),testtype,Type::Numeric);
berns:=lists[2];
ni:=op(berns[1],1);
ki:=op(berns[1],2);
delete berns[1];
if nops(berns)>=2
then
while nops(berns)>=1
do
n:=op(berns[1],1);
k:=op(berns[1],2);
prod:=dom(_plus(ni,n),_plus(ki,k));
delete berns[1];
ni:=op(prod,1);
ki:=op(prod,2);
end_while;
c:=_mult(select(args(),testtype, Type::Numeric));
freeze(_mult)(c,dom(ni,ki));
else
c:=_mult(select(args(),testtype, Type::Numeric));
berns:=_mult(select(args(),x -> expr2text(x)[1] = "B"));
freeze(_mult)(c,berns):
end_if;
end_proc: