Spawn the server from the `register` function, not inside `ServerPanel.draw`:

    import multiprocessing as mp
    import socket
    import sys
    import bpy
    import time
    import threading
    from xmlrpc.server import SimpleXMLRPCServer
    import xmlrpc.client
    bl_info = {
        "name": "XMLRPC Server",
        "author": "KristenH",
        "version": (0, 5, 0, 1),
        "blender": (2, 79, 0),
        "category": "System"
    }


    HOST = 'localhost'
    PORT = 8000

    class SimpleServer(SimpleXMLRPCServer):
        pass


    def command(com):
        com = 'import bpy\n'+com
        exec(com)
        return com


    def server_data():
        return bpy.app.version_string, bpy.context.blend_data.filepath, socket.gethostname()


    class ServerPanel(bpy.types.Panel):
        bl_label = "Server Panel"
        bl_idname = "Object_PT_server"
        bl_space_type = 'PROPERTIES'
        bl_region_type = 'WINDOW'
        bl_category = "Shortcuts"
        proxy = xmlrpc.client.ServerProxy("http://localhost:8000/")

        def draw(self, context):
            layout = self.layout
            version_string, filepath, hostname = self.proxy.server_data()
            print('found server on', 'localhost:', hostname)
            layout.row().label(text="Server found on: {}:{}".format(hostname,PORT))
            layout.row().label(text="Press Ctrl-C in terminal to exit".format(hostname,PORT))        

    def register():
        global thread
        proc = mp.Process(target=maybe_launch_server)
        proc.daemon = True
        proc.start()
        bpy.utils.register_class(ServerPanel)


    def unregister():
        bpy.utils.unregister_class(ServerPanel)


    def maybe_launch_server():
        proxy = xmlrpc.client.ServerProxy("http://localhost:8000/")
        try:
            result = proxy.server_data()
        except ConnectionRefusedError:
            server = SimpleServer((HOST, PORT))
            server.register_introspection_functions()
            server.register_function(command, "command")
            server.register_function(server_data, "server_data")
            version_string = bpy.app.version_string
            print("Started the server with:", HOST, ":", PORT)
            server.serve_forever()


    if __name__ == "__main__":
        register()


This spawns the server as a separate process. `proc.daemon = True` causes the process to terminate when the calling process terminates. That means that whatever blender starts the server is the "main" process, and when it terminates, so does the server.