In GAP (which is also tagged) there are two possibilities. One could either act on cosets for both subgroups, or one could combine the two actions to a subdirect product.
As an example, lets take the actions of $S_4$ on the cosets of $S_3$ and of $V_4$:
gap> G:=SymmetricGroup(4);;
gap> H1:=SymmetricGroup(3);;H2:=Socle(G);;StructureDescription(H2);
"C2 x C2"
In the first example we simply concatenate the lists of costs as domain, and act on these by right multiplication (GAP always acts from the right and uses right cosets):
gap> cos:=Concatenation(RightCosets(G,H1),RightCosets(G,H2));
[ RightCoset(Sym( [ 1 .. 3 ] ),()), RightCoset(Sym( [ 1 .. 3 ] ),(1,4)),
RightCoset(Sym( [ 1 .. 3 ] ),(1,4,2)), RightCoset(Sym( [ 1 .. 3 ] ),(1,4,
3)), RightCoset(Group([ (1,4)(2,3), (1,2)(3,4) ]),()), RightCoset(Group(
[ (1,4)(2,3), (1,2)(3,4) ]),(3,4)), RightCoset(Group(
[ (1,4)(2,3), (1,2)(3,4) ]),(2,3)), RightCoset(Group(
[ (1,4)(2,3), (1,2)(3,4) ]),(2,3,4)), RightCoset(Group(
[ (1,4)(2,3), (1,2)(3,4) ]),(2,4,3)), RightCoset(Group(
[ (1,4)(2,3), (1,2)(3,4) ]),(2,4)) ]
gap> act:=ActionHomomorphism(G,cos,OnRight,"surjective");
<action epimorphism>
gap> p:=Image(act);
Group([ (1,2,3,4)(5,10)(6,9)(7,8), (2,3)(5,6)(7,9)(8,10) ])
gap> Orbits(p,MovedPoints(p));
[ [ 1, 2, 3, 4 ], [ 5, 10, 6, 8, 9, 7 ] ]
In the sectond version, we constrcut the two permutation actions separately:
gap> p1:=Image(FactorCosetAction(G,H1));
Group([ (1,2,3,4), (2,3) ])
gap> p2:=Image(FactorCosetAction(G,H2));
Group([ (1,6)(2,5)(3,4), (1,2)(3,5)(4,6) ])
Now, we can combine the generator lists on disjoint domains:
gap> diag:=SubdirectDiagonalPerms(GeneratorsOfGroup(p1),GeneratorsOfGroup(p2));
[ (1,2,3,4)(5,10)(6,9)(7,8), (2,3)(5,6)(7,9)(8,10) ]
gap> p:=Group(diag);
Group([ (1,2,3,4)(5,10)(6,9)(7,8), (2,3)(5,6)(7,9)(8,10) ])
If you want to keep the connection better, you could instead use the formal embeddings into a direct product:
gap> d:=DirectProduct(p1,p2);
Group([ (1,2,3,4), (2,3), (5,10)(6,9)(7,8), (5,6)(7,9)(8,10) ])
gap> emb1:=Embedding(d,1);;emb2:=Embedding(d,2);;
gap> gens1:=GeneratorsOfGroup(p1);;gap> diag:=List([1..Length(gens1)],x->Image(emb1,gens1[x])
> *Image(emb2,gens2[x]));
[ (1,2,3,4)(5,10)(6,9)(7,8), (2,3)(5,6)(7,9)(8,10) ]
gap> gens2:=GeneratorsOfGroup(p2);;
gap> diag:=List([1..Length(gens1)],x->Image(emb1,gens1[x])
> *Image(emb2,gens2[x]));
[ (1,2,3,4)(5,10)(6,9)(7,8), (2,3)(5,6)(7,9)(8,10) ]