From 2012 Higher Computing Marking Scheme, a function is “A (self-contained/discrete/named) module/unit/block/section of code (1 mark) which has a value/returns a single value to the calling program (1 mark)”
From 2011 Higher Computing Marking Scheme, “A function can only return a single value (1 mark). A procedure can return any number of values (1 mark). The value of a function can be assigned to a variable (1 mark) a procedure has no value (1 mark)”
You are correct, the join block is a function – it takes (two) parameters and returns a single value, and can be used in set-to blocks.
Likewise the “or” block, the “and” block”, the “<” block and the “>” block are all also functions.
I’m don’t think you can put an ask-and-wait block inside a set.-to block, so not strictly a function using above defintions – but it is debatable.