Could you paste the output of show create pipeline YOUR_PIPELINE_NAME and show create procedure YOUR_PROCEDURE_NAME, as well as a sample of the problematic inserted data - e.g. via select * from bad_column limit 1? This is in general unexpected, though it depends on how exactly the procedure is performing the insert.
The takeaway there is that you should use ::$ or json_extract_string() instead of :: to extract subobjects, if you want them to get assigned as SQL strings, rather than as JSON string objects (which will have escapes and enclosing quotes).
Also, since I know that it’s a common point of confusion: CREATE PIPELINE ... FORMAT JSON can handle extracting subobjects of each incoming JSON and assigning them to columns, with automatic type detection/conversion. If the stored procedure is just doing that, it’ll be more efficient to use that functionality and remove the stored procedure entirely.