You don’t get a closed intersection because your assumptions about how Rhino creates an intersection curve are flawed. This is an example of how learning to model without booleans would make you much more proficient. One thing you would learn is that Rhino is creating the intersection curve surface by surface. Whether the surfaces are part of a solid (closed polysurface) is not important to getting a good and useful intersection curve.
In the enclosed file are your 2 objects reduced to just the surfaces that are relevant to the issue of finding a good intersection. When you add more surfaces than the minimum needed that doesn’t improve the chances of getting a good complete intersection. In fact the whole flawed process of trying to create 2 intersecting solids in order to make a boolean succeed is often the very process that introduces the errors that leads to a defective or useless intersection curve and thus a failed boolean.
NoAdd_NoProblem.3dm (99.6 KB)
In my file you can just select the 2 objects (cyan and black) and run the Trim command, then pick the parts you want trimmed off and then after trimming both objects hit the Join button.
You can compare the edges in my file to the edges in your file to see how far off the trimmed boundaries are in your file.
If you want to see a better way to make the red object in your file, explode the black object in my file and then run UntrimAll, then join the 3 surfaces that make the U shape. Now you have 3 intersecting objects that you can run trim and join on to get a more useful version of your red object.