I understand how a computer works on the basic principles, such as, a program can be written in a \"high\" level language like C#, C and then it\'s broken down in to object code
I know processors have different instruction sets above the basic x86 instruction set. Do all assembly languages support all instruction sets?
"Assembly language" is a kind of misnomer, at least in the way you are using it. Assemblers are less of a language (CS graduates may object) and more of a converter tool which takes textual representation and generates a binary image from it, with a close to 1:1 relationship between text elements (memnonics, labels and numbers) and binary elements. There is no deeper logic behind the elements of an assembler language because their possibilities to be quoted and redirected ends mostly at level 1; you can, for example, use EAX only in one instruction at a time - the next use of EAX in the next instruction bears no relationship with its previous use EXCEPT for the unwritten logical connection which the programmer had in mind - this is the reason why it is so easy to create bugs in assembler.
How would someone go about writing a routine in assembly, and then compiling it in to object/binary code?
One would need to pin down the lowest common denominator of instruction sets and code the function times the expected architectures the code is intended to run on. IOW if you are not coding for a certain hardware platform which is defined at the time of writing (e.g. a game console, an embedded board) you no longer do this.
How would someone then reference the functions/routines within that assembly code from a language like C or C++?
You need to declare them in your HLL - see your compilers handbook.
How do we know the code we've written in assembly is the fastest it possibly can be?
There is no way to know. Be happy about that and code on.