It seems a bit unclear to me what you are actually after.
You started by saying you want a face-face offset, and showed a diagram illustrating that you want constant face to face distances - ie parallel faces.
What you show above is another way of computing one normal per vertex and moving the out along this, which does not solve this problem.
To illustrate, take the example of trying to offset this red rectangular pyramid by moving the vertices.
We take planes offset by unit distance from each of the 2 big faces of the pyramid. We know that for the offset mesh to have constant face-face distance, the new top point must lie on both of these planes, i.e. it must be somewhere on the magenta intersection line.
We also take unit offset planes from the 2 small faces. By the same logic the point must also lie on their intersection - the green line.
So what you are trying to do boils down to finding a single vector you can move the top point along to get a single new point which somehow lies on both the green and the magenta lines… but this is clearly impossible as the lines do not intersect, so no such point exists.
You can use various weighting schemes to average the face normals to distribute the error, but there will be variations in face-face distance, so it is not a face-offset mesh. (depending what you want to do with this it might not matter though)
To get a true constant distance parallel face offset mesh though, you need 2 top points like this:
For purely convex vertices the solution is not too hard to find and there is only one possibility without self intersections. For the general case though, where the edges coming into the vertex are a mix of up/down folds, there can be many* different topological solutions, some of which will be self-intersecting and some of which are not. Finding a good one among these is the tricky bit.
*actually the number of possibilities increases as the Catalan number of connected faces -2. So for 3 faces there’s a single solution, for 4 there are 2, but they go up fast, For a vertex surrounded by 10 faces you’d need to check 1430 different possibilities if brute forcing it (I’m still trying to figure out if there’s a better way, perhaps using straight skeleton or motorcycle graph along the lines described here).

