If you're only concerned about visualization and not computation, you could always create a relation and pass it to a plotting function. If the number of points is low enough and your distance function isn't too unwieldy, you should get ok results.
VoronoiBoundaryPlot[pts_, bds_, df_:EuclideanDistance] :=
Block[{nf, isoLine, x1, x2, y1, y2, mr, δ = .005, good, keep},
nf = Nearest[pts -> {"Index", "Element"}, DistanceFunction -> df];
isoLine[q_] := df[#1, q] - df[#2, q]& @@ Sort[nf[q, {2, ∞}]][[All, 2]];
{{x1, x2}, {y1, y2}} = bds;
mr = DiscretizeGraphics[ContourPlot[isoLine[{x, y}] == 0, {x, x1, x2},{y, y1, y2}, PlotPoints -> 80, Evaluated -> False]];
good = Pick[Range[MeshCellCount[mr, 0]], UnitStep[Abs[isoLine /@ MeshCoordinates[mr]] - δ], 0];
keep = Cases[Tally[mr["ConnectivityMatrix"[0, 1]][[good]]["NonzeroPositions"][[All, 2]]], {_,2}][[All, 1]];
Graphics[{
GraphicsComplex[MeshCoordinates[mr], {Red, MeshCells[mr, {1, keep}]}],
{Point[pts]}
}]
]
A small example:
SeedRandom[1234];
pts = RandomReal[{0, 1}, {20, 2}];
dfs = {BrayCurtisDistance, ChessboardDistance, EuclideanDistance, ManhattanDistance};
bds = {{-.1, 1.1}, {-.1, 1.1}};
Table[Show[VoronoiBoundaryPlot[pts, bds, df], PlotLabel -> df], {df, dfs}]

VoronoiMesh, but the "properties and relations" section of the docs shows an example where the conditions for each cell are generated explicitly and the mesh is reproduced withRegionPlot. That's not typically very fast, but it may work for you. What functional expression would "Euclidean distance on the flat torus" have? – MarcoB Mar 19 '19 at 14:34