Posting my solution here, in case anyone finds it helpful.
As long as it's all structured in the same scene it's not terribly difficult. I ended up forwarding the click position into the sub-viewport's root Spatial node, and did a raycast using a RayCast node attached to the camera.
In the calling node:
extends ViewportSprite
onready var vp_scene = get_parent().get_node("viewport/root")
func _ready():
set_process_input(true)
func _input(event):
if(event.type==InputEvent.MOUSE_BUTTON):
vp_scene.forward_click(event.pos - get_global_transform().get_origin())
In the receiving Spatial node:
onready var camera = get_node("camera")
onready var click_cast = get_node("camera/click_ray")
var ray_length = 3
func forward_click(click_pos):
click_cast.set_cast_to(camera.project_ray_normal(click_pos) * ray_length)
func _fixed_process(delta):
if(click_cast.is_colliding()):
print(click_cast.get_collision_point())
# DO STUFF
func _ready():
set_fixed_process(true)