Finding the best-fitting subsets by frequencies of list item groupings

I think you can pose this as a graph partitioning problem, and in the case where you want ideal groupings, FindGraphPartition "finds a partition such that the sum of edge weights for edges having endpoints in different parts is minimized" according to the documentation. Here our edge weights are the number of co-occurences:

list = {{1,2,3}, {1,2}, {2,3}, {3,4}};
allitems = Flatten[list] // DeleteDuplicates;

countoccur[groups_, {i_, j_}] := 
 Count[ContainsAll[#, {i, j}] & /@ groups, True]

edges = DeleteCases[
   If[Unequal @@ #, {UndirectedEdge @@ #, countoccur[list, #]}, 
      Nothing] & /@ Subsets[allitems, {2}], {_, 0}];

g = Graph[edges[[All, 1]], EdgeWeight -> edges[[All, 2]], 
   VertexLabels -> Automatic, EdgeLabels -> "EdgeWeight"];

(* add any missing vertices culled earlier (items in isolated groups)*)
g = VertexAdd[g, Complement[allitems, VertexList[g]]];

(* use the second argument of FindGraphPartition here if you want n 
  groups for each graph component *)
partitions = If[Length[#] > 1, FindGraphPartition[Subgraph[g, #]], {#}] & /@ 
   ConnectedComponents[g];

result = Join @@ partitions
(* result: {{3, 4}, {1, 2}} *)

An alternative approach: construct a WeightedAdjacencyGraph from input list and apply FindGraphPartition:

ClearAll[waG]
waG = Module[{vl = Union @@ #}, 
    WeightedAdjacencyGraph[vl, Normal[Total[(# + Transpose[#] &@
      SparseArray[Subsets[#, {2}] -> 1, {1, 1} Length@vl]) & /@ #]] /. 0 -> ∞]] &;

FindGraphPartition @ waG @ {{1, 2, 3}, {1, 2}, {2, 3}, {3, 4}}
 {{3, 4}, {1, 2}}
FindGraphPartition @ waG @ {{1, 2}, {3}}
 {{1, 2}, {3}}
FindGraphPartition @ waG @ {{1, 2, 3}, {1, 2}, {3, 4}}
 {{3, 4}, {1, 2}}