OK, I found a second way. Like kglr's solution, this one also uses AssociationThread, but applies it only once:
makeDataset[columns_, columnLabels_] := Module[{labeledColumns, records}, labeledColumns = AssociationThread[columnLabels, columns]; records = Transpose[labeledColumns, AllowedHeads -> All]; Dataset[records] ];
The importer can be easily written in terms of makeDataset:
readDataset[datafile_, headerfile_] := Module[{columns, columnLabels}, columns = Transpose[Import[datafile]]; columnLabels = First[Import[headerfile]]; makeDataset[columns, columnLabels] ];