DeleteDuplicates[SortBy[Last@# == "x" &] @ lis,
Most[#] == Most[#2] && MemberQ[Last /@ {##}, "x"] &]
{{"a", "b", "c"}, {"d", "e", "f"}, {"g", "h", "i"}}
Update: A more flexible approach using SequenceReplace
+ OrderlessPatternSequence
:
ClearAll[f]
f = SequenceReplace[{OrderlessPatternSequence[
p1 : {a___, _, b___}, {a___, "x", b___}]} :> p1];
Examples:
lis = {{"a", "b", "c"}, {"d", "e", "f"}, {"d", "e", "x"}, {"g", "h", "i"}};
lis2 = {{"a", "b", "c", "z"}, {"d", "e", "f", "z"}, {"d", "e", "x", "z"},
{"g", "h", "i", "z"}, {"w", "x", "y", "z"}, {"w", "x", "x", "z"}};
lis3 = {{"a", "b", "c", "z"}, {"d", "e", "f", "z"}, {"d", "e", "x", "z"},
{"g", "h", "i", "z"}, {"q", "r", "s", "t"}, {"q", "r", "x", "t"}};
f @ lis
{{"a", "b", "c"}, {"d", "e", "f"}, {"g", "h", "i"}}
f @ lis2
{{"a", "b", "c", "z"}, {"d", "e", "f", "z"},
{"g", "h", "i", "z"}, {"w", "x", "y", "z"}}
f @ lis3
{{"a", "b", "c", "z"}, {"d", "e", "f", "z"},
{"g", "h", "i", "z"}, {"q", "r", "s", "t"}}