Components only re-render when state or props update. App has no state, or props so it never re-renders, thus the child Cursor never re-renders.
You can use a ref attached to Cursor and set the top and left properties directly. Please don't forget to also remove the event listener when the component unmounts.
import React, { useEffect, useRef } from "react";
import "./styles.css";
import styled from "styled-components";
const Cursor = styled.div`
height: 30px;
width: 30px;
border-radius: 50%;
border: 1.5px solid black;
position: absolute;
`;
export default function App() {
const posRef = useRef(null);
const cursor = e => {
const { clientX = 0, clientY = 0 } = e;
posRef.current.style.left = clientX + "px";
posRef.current.style.top = clientY + "px";
// console.log(clientX, clientY);
};
useEffect(() => {
window.addEventListener("mousemove", cursor);
return () => window.removeEventListener("mousemove", cursor);
}, []);
return (
<div className="App">
<h1>Demo</h1>
<Cursor ref={posRef} />
</div>
);
}

EDIT
As pointed out by @KirillSkomarovskiy, using state wasn't what was bogging down and crashing the page. I suspect it is/was the adding of multiple/duplicate mousemove handlers that weren't being cleaned up properly (possibly compounded by logging each updated position).
const Cursor = styled.div`
height: 30px;
width: 30px;
border-radius: 50%;
border: 1.5px solid black;
position: absolute;
transform: translate(-50%, -50%);
top: ${props => props.yPos};
left: ${props => props.xPos};
`;
export default function App() {
const [pos, setPos] = useState({ x: 0, y: 0 });
useEffect(() => {
const cursor = e => {
setPos({
x: e.clientX + "px",
y: e.clientY + "px"
});
// console.log(e.clientX, e.clientY);
};
window.addEventListener("mousemove", cursor);
return () => window.removeEventListener("mousemove", cursor);
}, []);
return (
<div className="App">
<h1>Demo</h1>
<Cursor xPos={pos.x} yPos={pos.y} />
</div>
);
}
