Joining and resolving two paths while keeping them relative conditionally
You can use the System.IO.Path.Combine Method.


  This method is intended to concatenate individual strings into a single string that represents a file path. However, if an argument other than the first contains a rooted path, any previous path components are ignored, and the returned string begins with that rooted path component. 


$combined = [IO.Path]::Combine($Base, $Chained)


Also, it seems more natural to use System.IO.Path.IsPathRooted() method instead of Split-Path to see if the path is absolute.

$isRelative = ![IO.Path]::IsPathRooted($combined)


There is a way to pass parameter values by appending a colon after the parameter name in cmdlet. You can also pass values to the switch type parameter this way.

Verb-Noun -ParameterName:Value


Resolve-Path basically outputs a PathInfo object, but when the -Relative switch is set the output will be string.
Both types have a ToString () method, so you can get a path string without using an if statement. (The ToString() method of the PathInfo object outputs the value of the Path property)

function Chain-Path($Base, $Chained) {
    $combined = [IO.Path]::Combine($Base, $Chained)
    $isRelative = ![IO.Path]::IsPathRooted($combined)
    (Resolve-Path $combined -Relative:$isRelative).ToString()
}